【问题标题】:UIImagePickerControllerOriginalImage is not working in ios 11.2.1UIImagePickerControllerOriginalImage 在 ios 11.2.1 中不起作用
【发布时间】:2018-06-07 02:07:45
【问题描述】:

在什么情况下我会难过?如果我将allowEditing 设置为 false。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        // I am happy :)
    } else {
        // I am sad :(
    }
    dismiss(animated: true, completion: nil)
}

(我在 iOS 11.2.1 iPhone SE(根据 Crashlytics)中遇到了崩溃,如果存在可能失败的合法条件或者这只是一个 iOS 错误,我会感到困惑。)

【问题讨论】:

  • 你在plist中设置权限描述了吗?
  • @RichieRich,是的,它适用于我的大多数用户。

标签: ios swift uiimage uiimagepickercontroller ios11.2


【解决方案1】:

在 IOS 12 中发生了变化

  image.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage

【讨论】:

    【解决方案2】:

    我在 Apple 开发者论坛线程中读到,如果 iOS 11 上的图像尺寸较大(大于 2048 X 2048)UIImagePickerControllerOriginalImage 将返回 nil。作为解决方法,该帖子建议使用Photos framework 来获取挑选的图像。该帖子中提供的解决方案如下:

    目标 C:

    __block UIImage *image = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];  
    if (@available(iOS 11.0, *))  
    {   
        PHAsset * asset = (PHAsset*)[info objectForKey:UIImagePickerControllerPHAsset];  
        PHImageManager *manager = [PHImageManager defaultManager];  
        PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];  
        requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact;  
        requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;  
        requestOptions.synchronous = true;  
        [manager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:requestOptions resultHandler:^void(UIImage *img, NSDictionary *info) {  
           if(img != nil)  
           {  
              image = img;  
           }  
        }];  
    }
    

    参考:iOS 11 does not return the original image for large images with UIImagePickerControllerOriginalImage

    斯威夫特:

    var image = info[UIImagePickerControllerOriginalImage]
    if #available(iOS 11.0, *)
    {
        let asset                    = info[UIImagePickerControllerPHAsset] as! PHAsset
        let manager                  = PHImageManager.default()
        let requestOptions           = PHImageRequestOptions()
        requestOptions.resizeMode    = PHImageRequestOptionsResizeMode.exact
        requestOptions.deliveryMode  = PHImageRequestOptionsDeliveryMode.highQualityFormat
        requestOptions.isSynchronous = true
        manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.default, options: requestOptions, resultHandler: { (img, info) in
            if img != nil
            {
                image = img
            }
        })
    }
    

    【讨论】:

    • @Midhun 获得img==nil 的可能情况是什么?
    • @CamiloAguilar:一种情况是,您已保存资产 url 并删除了图像,然后使用已删除的 url 请求图像。在这种情况下,图像将为零。
    • 我的原始图像为零。这对我有用。
    【解决方案3】:

    方法签名改变如下:

      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
    
        // Set photoImageView to display the selected image.
        photoImageView.image = selectedImage
    
        // Dismiss the picker.
        dismiss(animated: true, completion: nil)
    }
    

    注意第二个参数:

    didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]
    

    它不是前面方法签名中的字符串数组。

    【讨论】:

      【解决方案4】:

      我最终使用了这个:

      import Photos
      
      extension UIImage {
          static func from(info: [String : Any]) -> UIImage? {
              if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                  return image
              }
      
              var imageToBeReturned: UIImage?
              if let url = info[UIImagePickerControllerReferenceURL] as? URL,
                  let asset = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil).firstObject {
                  let manager = PHImageManager.default()
                  let option = PHImageRequestOptions()
                  option.isSynchronous = true
                  manager.requestImage(for: asset, targetSize: CGSize(width: 1000, height: 1000), contentMode: .aspectFit, options: option, resultHandler: {(image: UIImage?, info: [AnyHashable : Any]?) in
                      imageToBeReturned = image
                  })
              }
              return imageToBeReturned
          }
      }
      

      这样-

      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
          if let selectedImage = UIImage.from(info: info) {
              // I am happy :)
          } else {
              // I am sad :(
          }
          dismiss(animated: true, completion: nil)
      }
      

      这对我有用,请提出任何改进建议:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多