123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- //
- // TSPhotoPickerManager.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/2/25.
- //
- import UIKit
- import PhotosUI
- 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() {
- imagePicker = UIImagePickerController()
- imagePicker.sourceType = .photoLibrary
- imagePicker.delegate = self
- imagePicker.mediaTypes = ["public.image"] // 只选择照片
- imagePicker.modalPresentationStyle = .overFullScreen
- // imagePicker.modalTransitionStyle = .crossDissolve
- if #available(iOS 13.0, *) {
- imagePicker.overrideUserInterfaceStyle = .dark
- }
- viewController?.present(imagePicker, animated: true, completion: nil)
- }
-
- /// 显示权限提示
- 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)
- }
- }
- // 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{
-
- // 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)
- }
- }
- }
- }
|