带有IOS9的iPad上的UIImagePickerController

pet*_*ete 32 uiimagepickercontroller ipad ios swift

从iOS 9和Xcode 7开始,我无法再在iPad(设备和模拟器)上实现UIImagePickerController.以下代码适用于iPad,但仅适用于iOS 9.使用iOS 9+时,显示的图像(在UIImagePickerController被取消后)是所选图像的错误版本.没有重新调整大小或裁剪最终图像只是原始图像的右上角?? 另外一个问题 - 如果imagePicker.allowsEditing = false,你无法从PhotoLibrary中选择图像?

@IBAction func photoButton(sender: AnyObject) {    

    imagePicker.allowsEditing = true
    imagePicker.sourceType = .PhotoLibrary

    self.presentViewController(imagePicker, animated: false, completion: nil)

}


func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {

    self.imageView.image = pickedImage

    dismissViewControllerAnimated(true, completion: { () -> Void in
            })    

}
Run Code Online (Sandbox Code Playgroud)

下面是UIImagePickerController中显示的选定图像的示例.(注意所选图像如何呈现非常小而不像以前那样呈现屏幕的全尺寸/宽度)

在此输入图像描述

在UIImagePickerController中选择使用按钮后,最终图像仅在原始图像的右上角.我在做错了什么或是在iOS 9上破坏了UIImagePickerController?

在此输入图像描述

MPa*_*ulo 11

这是Apple的一个错误:http: //openradar.appspot.com/radar?id = 5032957332946944

当前糟糕的解决方法:

 if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
         imagePicker.allowsEditing = false
     } else {
         imagePicker.allowsEditing = true
     }
Run Code Online (Sandbox Code Playgroud)

Swift 3.0:

if UIDevice.current.userInterfaceIdiom == .pad {
}
Run Code Online (Sandbox Code Playgroud)


Tej*_*uri 3

您需要确保您的图像视图具有正确的框架,并且图像视图的内容模式应该是宽高比,并且选择器返回的图像是类型[UIImagePickerControllerOriginalImage]

[imageView setFrame:imageViewRect];
[imageView setContentMode:UIViewContentModeScaleAspectFit];
Run Code Online (Sandbox Code Playgroud)

迅速:

 imageView.setFrame(imageViewRect)
 imageView.setContentMode(UIViewContentModeScaleAspectFit)
Run Code Online (Sandbox Code Playgroud)

来到allowsEditing酒店,与照片选择无关。

它是一个布尔值,指示是否允许用户编辑所选的静态图像或电影。

如果你想从相机库中选择照片,那么你需要将来源类型修改为

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
Run Code Online (Sandbox Code Playgroud)

更新:

假设您选择了一张图像并将其显示在图像视图上。我假设视图上有一个图像视图,并且图像视图框架等于视图框架。如果 IB 是自由形式的,我假设 IB 中图像视图帧的大小为 600x600。

如果你只是这样做:

     _startImageView.image=_img;
Run Code Online (Sandbox Code Playgroud)

结果将是:

在此输入图像描述

现在让我们对要在 imageview 中显示的图像进行一些更改:

  CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(_img.size, CGRectMake(0, 0, self.startImageView.frame.size.width, self.startImageView.frame.size.height));
UIGraphicsBeginImageContext(CGSizeMake(_startImageView.frame.size.width,_startImageView.frame.size.height));
 [_img drawInRect:scaledRect];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

_startImageView.image=scaledImage;
Run Code Online (Sandbox Code Playgroud)

现在图像将是:

在此输入图像描述

未缩放时选择的原始图像尺寸为 640x426 。

当缩放到最大时(使用两根手指缩放操作),选择的原始图像尺寸为 1536x1286 。

正如你所看到的,图像仍然没有巨大的变化,这是因为当你的 imageview 收到图像时图像已经被裁剪/缩放了

所以即使你尝试这样做:

      [_img drawInRect:_startImageView.frame];
Run Code Online (Sandbox Code Playgroud)

图像不会根据我们的需要绘制,因为图像已经在此时缩放,因为选择器给出的图像是edited image.

解决方案:

要解决此问题,您需要从didFinishPickingMediaWithInfo:方法中的选择器中选择原始图像

       info[UIImagePickerControllerOriginalImage];
Run Code Online (Sandbox Code Playgroud)

这给你的图像:

在此输入图像描述

  • 我上面的评论的更新:我缩小了问题的范围 - 它是特定于 iPad 的。在 PhotoPicker 演示应用程序项目的部署信息中选择 iPhone,它会按预期工作。但是,当设置为 iPad 时,从 imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *) info 方法中的信息返回的editedImage 被裁剪到左上角。(原始图像很好)。对示例应用程序进行修改以重现:1) 添加 imagePickerController.allowsEditing = YES; 第 118 行之后 (2认同)