|
|
|
//
|
|
|
|
// CustomPickerControllers.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 CustomPickerControllers: 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.cancelFB.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.photoFB.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 CustomPickerControllers {
|
|
|
|
|
|
|
|
/// 循环闪光灯状态切换
|
|
|
|
///
|
|
|
|
/// - 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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|