123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- //
- // TSPhotoPickerManager.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/2/25.
- //
- import UIKit
- import PhotosUI
- import HXPhotoPicker
- class TSPhotoPickerManager: NSObject {
- lazy var config: PickerConfiguration = {
- var config = PickerConfiguration()
- config.modalPresentationStyle = .automatic
- config.selectOptions = .photo
- config.selectMode = .single
- config.isSelectedOriginal = true
- config.photoList.sort = .desc
- config.photoSelectionTapAction = .quickSelect
- config.photoList.finishSelectionAfterTakingPhoto = true
- config.photoList.isSaveSystemAlbum = false
- config.photoList.takePictureCompletionToSelected = true
-
- var cameraConfig = SystemCameraConfiguration()
- cameraConfig.allowsEditing = false
- config.photoList.cameraType = .system(cameraConfig)
- return config
- }()
-
- var picker: PhotoPickerController?
- lazy var multipleConfig: PickerConfiguration = {
- var config = PickerConfiguration()
- config.modalPresentationStyle = .automatic
- config.selectOptions = .photo
- config.selectMode = .multiple
- config.maximumSelectedCount = 2
- config.isSelectedOriginal = true
- config.photoList.sort = .desc
- config.photoSelectionTapAction = .preview
- config.photoList.finishSelectionAfterTakingPhoto = false
- config.photoList.isSaveSystemAlbum = false
- config.photoList.takePictureCompletionToSelected = true
- var cameraConfig = SystemCameraConfiguration()
- cameraConfig.allowsEditing = false
- config.photoList.cameraType = .system(cameraConfig)
- return config
- }()
-
-
-
- // MARK: - Properties
- private weak var viewController: UIViewController?
- private var completionHandler: (([UIImage]) -> Void)?
- private var maxSelected:Int = 1
- // MARK: - Initializers
- init(viewController: UIViewController) {
- self.viewController = viewController
- }
-
- // MARK: - Public Methods
- /// 打开照片选择器,单选一张照片
- func pickPhoto(maxSelected:Int = 1,completion: @escaping ([UIImage]) -> Void) {
- self.completionHandler = completion
- self.maxSelected = maxSelected
- // 检查相册权限
- checkPhotoLibraryPermission { [weak self] authorized in
- guard let self = self else { return }
- if authorized {
- self.openPhotoPicker()
- } else {
- self.showPermissionAlert()
- }
- }
- }
-
- // MARK: - Private Methods
- /// 检查相册权限
- private func checkPhotoLibraryPermission(completion: @escaping (Bool) -> Void) {
- let status = PHPhotoLibrary.authorizationStatus()
- switch status {
- case .authorized:
- completion(true)
- case .notDetermined:
- PHPhotoLibrary.requestAuthorization { newStatus in
- DispatchQueue.main.async {
- completion(newStatus == .authorized)
- }
- }
- default:
- completion(false)
- }
- }
-
- /// 打开照片选择器
- private func openPhotoPicker() {
-
- var config = config
- if maxSelected > 1 {
- config = multipleConfig
- config.maximumSelectedCount = maxSelected
- }
- let picker = PhotoPickerController(splitPicker: config)
- picker.pickerDelegate = self
- picker.autoDismiss = false
- viewController?.present(picker, animated: true, completion: nil)
- self.picker = picker
- }
-
- /// 显示权限提示
- private func showPermissionAlert() {
- let alert = UIAlertController(
- title: "No photos permission".localized,
- message: "Please enable photo permission in settings to select photos".localized,
- preferredStyle: .alert
- )
- alert.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel, handler: nil))
- alert.addAction(UIAlertAction(title: "Go to Settings".localized, style: .default) { _ in
- if let url = URL(string: UIApplication.openSettingsURLString) {
- UIApplication.shared.open(url, options: [:], completionHandler: nil)
- }
- })
- viewController?.present(alert, animated: true, completion: nil)
- }
-
- deinit {
- debugPrint("♻️♻️♻️ TSPhotoPickerManager -> TSPhotoPickerManager deinit ♻️♻️♻️")
- }
-
- func dismissPageVC(){
- self.picker?.view.isHidden = true
- self.picker?.dismiss(animated: false)
- self.picker = nil
- }
- }
- extension TSPhotoPickerManager: PhotoPickerControllerDelegate {
- func pickerController(_ pickerController: PhotoPickerController, didFinishSelection result: PickerResult) {
- result.getImage(compressionScale: 1.0) { images in
- self.completionHandler?(images)
- }
- }
-
- func pickerController(didCancel pickerController: PhotoPickerController) {
- pickerController.dismiss(animated: true, completion: nil)
- }
- }
- //class TSPhotoPickerManager: NSObject {
- //
- // // MARK: - Properties
- // private weak var viewController: UIViewController?
- // private var completionHandler: ((UIImage?,PHAsset?) -> Void)?
- // private var completionSizeHandler: ((UIImage?,String?) -> Void)?
- // private var imagePicker = UIImagePickerController()
- // // MARK: - Initializers
- // init(viewController: UIViewController) {
- // self.viewController = viewController
- // }
- //
- // // MARK: - Public Methods
- // /// 打开照片选择器,单选一张照片
- // func pickSinglePhoto(completion: @escaping (UIImage?,PHAsset?) -> Void) {
- // self.completionHandler = completion
- // // 检查相册权限
- // checkPhotoLibraryPermission { [weak self] authorized in
- // guard let self = self else { return }
- // if authorized {
- // self.openPhotoPicker()
- // } else {
- // self.showPermissionAlert()
- // }
- // }
- // }
- //
- // // MARK: - Private Methods
- // /// 检查相册权限
- // private func checkPhotoLibraryPermission(completion: @escaping (Bool) -> Void) {
- // let status = PHPhotoLibrary.authorizationStatus()
- // switch status {
- // case .authorized:
- // completion(true)
- // case .notDetermined:
- // PHPhotoLibrary.requestAuthorization { newStatus in
- // DispatchQueue.main.async {
- // completion(newStatus == .authorized)
- // }
- // }
- // default:
- // completion(false)
- // }
- // }
- //
- // /// 打开照片选择器
- // private func openPhotoPicker() {
- // TSToastShared.showLoading(containerView: viewController?.view)
- // imagePicker = UIImagePickerController()
- // imagePicker.sourceType = .photoLibrary
- // imagePicker.delegate = self
- // imagePicker.mediaTypes = ["public.image"] // 只选择照片
- //// imagePicker.modalPresentationStyle = .custom
- //// imagePicker.modalTransitionStyle = .crossDissolve
- // if #available(iOS 13.0, *) {
- // imagePicker.overrideUserInterfaceStyle = .dark
- // }
- // viewController?.present(imagePicker, animated: true){
- // TSToastShared.hideLoading()
- // }
- //
- // kMainAfter(3.0) {
- // TSToastShared.hideLoading()
- // }
- // }
- //
- // /// 显示权限提示
- // private func showPermissionAlert() {
- // let alert = UIAlertController(
- // title: "No photos permission".localized,
- // message: "Please enable photo permission in settings to select photos".localized,
- // preferredStyle: .alert
- // )
- // alert.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel, handler: nil))
- // alert.addAction(UIAlertAction(title: "Go to Settings".localized, style: .default) { _ in
- // if let url = URL(string: UIApplication.openSettingsURLString) {
- // UIApplication.shared.open(url, options: [:], completionHandler: nil)
- // }
- // })
- // viewController?.present(alert, animated: true, completion: nil)
- // }
- //
- // deinit {
- // debugPrint("♻️♻️♻️ TSPhotoPickerManager -> TSPhotoPickerManager deinit ♻️♻️♻️")
- // }
- //}
- //
- //// MARK: - UIImagePickerControllerDelegate & UINavigationControllerDelegate (iOS 14 以下)
- //extension TSPhotoPickerManager: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
- // func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
- //// picker.dismiss(animated: true) {
- // if let image = info[.originalImage] as? UIImage {
- // self.completionHandler?(image,info[.phAsset] as? PHAsset )
- // } else {
- // self.completionHandler?(nil,nil)
- // }
- //// }
- //
- // if completionSizeHandler == nil {
- // picker.dismiss(animated: true, completion: nil)
- // }
- //
- // }
- //
- // func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
- //// self.completionHandler?(nil,nil)
- //// if completionSizeHandler == nil {
- // picker.dismiss(animated: true, completion: nil)
- //// }
- // }
- //}
- //
- //
- //
- //extension TSPhotoPickerManager{
- //
- // func pickCustomSinglePhoto(completion: @escaping (UIImage?,String?) -> Void) {
- // self.completionSizeHandler = completion
- // pickSinglePhoto { [weak self] image,phAsset in
- // guard let self = self else { return }
- // self.completionSizeHandler?(image,nil)
- // self.completionSizeHandler = nil
- // }
- // }
- //
- // // MARK: - Public Methods
- // /// 打开照片选择器,单选一张照片
- // func pickSinglePhoto(maxBitSize:Int, completion: @escaping (UIImage?,String?) -> Void) {
- // self.completionSizeHandler = completion
- //
- // let maxmbSize = Int(Double(maxBitSize) / (1024 * 1024))
- // pickSinglePhoto { [weak self] image,phAsset in
- // guard let self = self else { return }
- // if let image = image,let phAsset = phAsset {
- // // 方法2:异步获取详细大小(不阻塞主线程)
- // TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
- // guard let self = self else { return }
- //
- // let mbSize = Double(size) / (1024 * 1024)
- // print("精确大小: \(mbSize) MB,size = \(size)")
- // if size > maxBitSize {
- // self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
- // }else{
- // self.completionSizeHandler?(image,nil)
- // self.completionSizeHandler = nil
- //// imagePicker.dismiss(animated: true)
- // }
- // }
- // }else{
- // if let image = image {
- // if image.isLargerThan(byteSize: maxBitSize) {
- // self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
- // }else{
- // self.completionSizeHandler?(image,nil)
- // self.completionSizeHandler = nil
- //// imagePicker.dismiss(animated: true)
- // }
- // }else{
- // self.completionSizeHandler?(nil,nil)
- //// imagePicker.dismiss(animated: true)
- // }
- // }
- // }
- // }
- //
- // func dismissPageVC(){
- // self.imagePicker.view.isHidden = true
- // self.imagePicker.dismiss(animated: true)
- // }
- //}
|