0

如果这在 iOS 的最后几个版本上工作,但在 14 上无法正常工作,我在过去的 5 天里一直在谷歌上搜索。

每当我从图库中添加图像时,选择图像的弹出窗口都是空白的。

我已经尝试过 UIImagePickerController(在 iOS13 及以下版本中运行良好)和新的 PHPickerViewController。

在 iOS14 之前一直在工作的是用户单击条形按钮以“添加图像”并且弹出窗口要求从图库中选择,然后在您的图库中向选择器显示图像。

我已经为 UIImagePickerController 设置了 Info.plist “隐私 - 照片库使用说明”,我知道 PHPickerViewController 不需要烫发,因为它会为您处理获取图像。

我也经常看到这些紫色警告说“xxxx 必须仅从主线程使用”,直到新的 Xcode 之前从未见过。

任何帮助将非常感激。运行 Xcode 12.0.1 (12A7300),模拟器运行 iOS14。

亚当

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

class AddCustomExerciseViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, GADBannerViewDelegate, UIImagePickerControllerDelegate, PHPickerViewControllerDelegate{

let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallery() }))
        alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
        self.present(alert, animated: true, completion: nil)

func openGallery()
{
    let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            self.showGallery()
            print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    self.showGallery()
                    print("success")
                }
            })
            print("It is not determined until now")
        case .restricted:
            // same same
            print("User do not have access to photo album.")
        case .denied:
            // same same
            print("User has denied the permission.")
        case .limited:
            // same same
            print("User has denied the permission.")
        }
}

func showGallery()
{
    if #available(iOS 14, *)
    {
        var configuration = PHPickerConfiguration()
        configuration.filter = .images
        configuration.selectionLimit = 0
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        self.present(picker, animated: true, completion: nil)
    }
    else
    {
                
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.allowsEditing = false
            imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let alert  = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        
        //get the file url
        if let fileUrl = info[UIImagePickerControllerImageURL] as? URL {
            print(fileUrl)
            print(fileUrl.lastPathComponent)
            let filePath = fileUrl.lastPathComponent
            
            if(filePath.hasSuffix("GIF")||filePath.hasSuffix("gif"))
            {
                //to change later to support gifs
                gifView.image = pickedImage
            }
            else
            {
                //to show the static image to users
                gifView.image = pickedImage
            }
            //for saving the file name to retrieve in local parse datastore
            imageNameToSave = fileUrl.lastPathComponent
        }
        //for saving the selected image
        imageToSave = pickedImage
    }
    picker.dismiss(animated: true, completion: nil)
}
@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
{
   picker.dismiss(animated: true, completion: nil)
   for result in results
   {
      result.itemProvider.loadObject(ofClass: UIImage.self, completionHandler: { (object, error) in
         if let image = object as? UIImage {
            DispatchQueue.main.async {
               // Use UIImage
               print("Selected image: \(image)")
            }
         }
      })
   }
}  }
4

2 回答 2

1

在 iOS 14 上,受限图像选择器权限对话框在单独的线程中打开,因此当授权返回时,您需要在主线程上执行 UI 任务。

PHPhotoLibrary.requestAuthorization({
        (newStatus) in
    DispatchQueue.main.async {
        print("status is \(newStatus)")
        if newStatus ==  PHAuthorizationStatus.authorized {
            self.showGallery()
            print("success")
        }
    }
})
于 2020-09-29T07:55:39.347 回答
0

如果这对其他人有帮助,我发现编辑滚动视图外观代理背景会导致 UIImagePickerController 和 PHPickerViewController 出现错误,从而阻止它们在 iOS 14 及更高版本中显示图像。我编辑了滚动视图背景代理,因为即使在浅色模式下它也是黑色的。经过数小时的谷歌搜索和测试,我发现删除滚动视图代理上的外观背景修改允许图像选择器按预期运行。我向 Apple 提交了错误报告。导致该错误的代码行是:

UIScrollView.appearance().backgroundColor = .systemBackground
于 2021-06-06T01:03:47.990 回答