You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

225 lines
7.5 KiB

//
// CustomPickerController.swift
// FunDoHealth
//
// Created by ecell on 2018/7/16.
// Copyright © 2020 ecell. All rights reserved.
//
import UIKit
enum ImagePickerButtonType {
///
case cancelCamera
///
case takePhoto
///
case flashClick
///
case switchCameras
}
typealias ImagePickerSelectedBtnClosure = (ImagePickerButtonType) -> Void
class CustomPickerController: UIImagePickerController {
//
var isFlash: Bool = false
var isCanTakePhoto: Bool = false
var isCancelPhoto: Bool = false
weak var flashBtn: UIButton!
weak var switchBtn: UIButton!
weak var cancelBtn: UIButton!
weak var takeBtn: UIButton!
var selectedClosure: ImagePickerSelectedBtnClosure?
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
bindUI()
}
func setupUI() {
self.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
self.allowsEditing = false
self.showsCameraControls = false
self.isCanTakePhoto = true
self.cameraDevice = UIImagePickerController.CameraDevice.rear
self.cameraFlashMode = UIImagePickerController.CameraFlashMode.off
// -
var cammeraY: CGFloat = 44.0;
if isIPhoneX {
cammeraY = 84.0;
}
self.cameraViewTransform = CGAffineTransform.init(translationX: 0, y: cammeraY)
//
let flashBtn = UIButton.init(type: UIButton.ButtonType.custom)
flashBtn.frame = CGRect(x: 7, y: isIPhoneX ? 52:12, width: 34, height: 34)
flashBtn.setImage(UIImage(named: "闪光灯关闭"), for: .normal)
view.addSubview(flashBtn)
self.flashBtn = flashBtn
//
let switchBtn = UIButton.init(type: UIButton.ButtonType.custom)
switchBtn.frame = CGRect(x: kScreenW - 10 - 34, y: isIPhoneX ? 52:12, width: 34, height: 34)
switchBtn.setImage(UIImage(named: "切换摄像头"), for: .normal)
view.addSubview(switchBtn)
self.switchBtn = switchBtn
var bottomSpacing = kScaleHeight(20.0)
if isIPhone5 || isIPhone4 {
bottomSpacing = kScaleHeight(8.0)
}else if (isIPhoneX) {
bottomSpacing = kScaleHeight(20+34)
}
//
let cancelBtn = UIButton.init(type: UIButton.ButtonType.custom)
cancelBtn.frame = CGRect(x: 8, y: kScreenH - 50 - bottomSpacing, width: 80, height: 50)
cancelBtn.setTitle(MultiLanguageKey.cancel.localized, for: .normal)
view.addSubview(cancelBtn)
self.cancelBtn = cancelBtn
//
let takeBtn = UIButton.init(type: UIButton.ButtonType.custom)
takeBtn.frame = CGRect(x: kScreenW/2.0 - 32.5, y: kScreenH - 65 - bottomSpacing, width: 65, height: 65)
takeBtn.setImage(UIImage(named: "拍照按钮"), for: .normal)
view.addSubview(takeBtn)
self.takeBtn = takeBtn
//
let photoLabel = UILabel.init(frame: CGRect(x: 0, y: takeBtn.mj_y - kScaleHeight(25.0), width: kScreenW, height: 17.0))
photoLabel.textAlignment = .center
photoLabel.font = SystemRegularFont(15)
photoLabel.text = MultiLanguageKey.photo.localized
photoLabel.textColor = UIColor.yellow
view.addSubview(photoLabel)
}
func bindUI() {
/**
*/
self.flashBtn.rx.tap
.asObservable().subscribe(onNext: { [weak self] _ in
guard let `self` = self else { return }
self.flashBtn.setImage(self.loopFlashState(), for: .normal)
if let selectedClosure = self.selectedClosure {
selectedClosure(ImagePickerButtonType.flashClick)
}
}).disposed(by: rx.disposeBag)
/**
*/
self.switchBtn.rx.tap.asObservable()
.subscribe(onNext: { [weak self] _ in
guard let `self` = self else { return }
if self.cameraDevice == UIImagePickerController.CameraDevice.rear {
self.cameraDevice = UIImagePickerController.CameraDevice.front
}else {
self.cameraDevice = UIImagePickerController.CameraDevice.rear
}
UIView.animate(withDuration: 0.5, animations: {
self.cameraViewTransform = CGAffineTransform.init(scaleX: -1.0, y: 1.0)
})
if let selectedClosure = self.selectedClosure {
selectedClosure(ImagePickerButtonType.switchCameras)
}
}).disposed(by: rx.disposeBag)
/**
*/
self.cancelBtn.rx.tap.asObservable()
.subscribe(onNext: { [weak self] _ in
guard let `self` = self else { return }
guard self.isCanTakePhoto else { return }
self.isCancelPhoto = false
if let selectedClosure = self.selectedClosure {
selectedClosure(ImagePickerButtonType.cancelCamera)
}
})
.disposed(by: rx.disposeBag)
/**
*/
self.takeBtn.rx.tap.asObservable()
.subscribe(onNext: { [weak self] _ in
guard let `self` = self else { return }
self.cancelAble()
self.takePicture()
if let selectedClosure = self.selectedClosure {
selectedClosure(ImagePickerButtonType.takePhoto)
}
})
.disposed(by: rx.disposeBag)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//
if isFlash {
self.cameraFlashMode = UIImagePickerController.CameraFlashMode.on
}
self.isCancelPhoto = true
}
///
func selfTakePicture() {
if isFlash {
guard self.isCanTakePhoto else { return }
self.isCanTakePhoto = false
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in
guard let `self` = self else { return }
self.isCanTakePhoto = true
}
}
if self.isCancelPhoto {
self.takePicture()
}
}
}
extension CustomPickerController {
///
///
/// - Returns:
func loopFlashState() -> UIImage {
isFlash = !isFlash
var imageStr: String = ""
if isFlash {
self.cameraFlashMode = UIImagePickerController.CameraFlashMode.on
imageStr = "闪光灯打开"
}else {
self.cameraFlashMode = UIImagePickerController.CameraFlashMode.off
imageStr = "闪光灯关闭"
}
return UIImage(named: imageStr)!
}
//退1
func cancelAble() {
var seconds: Double = 1.0
if self.cameraFlashMode == UIImagePickerController.CameraFlashMode.on {
seconds = 5.0
}
self.view.window?.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { [weak self] in
guard let `self` = self else { return }
self.view.window?.isUserInteractionEnabled = true
}
}
}