web-dev-qa-db-ja.com

iOS9搭載のiPadのUIImagePickerController

IOS 9とXcode 7以降、iPad(デバイスとシミュレーターの両方)にUIImagePickerControllerを実装できなくなりました。以下のコードはiPadで機能しますが、iOS 9より前のみです。iOS9以降を使用している場合、表示される画像(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
            })    

}

以下は、UIImagePickerControllerに表示される選択された画像の例です。 (選択した画像が非常に小さく表示され、以前のように画面のフルサイズ/幅ではないことに注意してください)

enter image description here

UIImagePickerController内の使用ボタンを選択した後、最終的な画像は元の画像の右上のみになります。 iOS 9でUIImagePickerControllerが壊れているのはなぜですか?

enter image description here

32
pete

これはAppleのバグです: http://openradar.appspot.com/radar?id=5032957332946944

現在のひどい回避策:

 if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
         imagePicker.allowsEditing = false
     } else {
         imagePicker.allowsEditing = true
     }

Swift 3.0:

if UIDevice.current.userInterfaceIdiom == .pad {
}
11
MPaulo

以下のコーディングを参照してください

@IBAction func photoButton(sender: AnyObject)
{
   if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
   {
     picker!.sourceType = UIImagePickerControllerSourceType.Camera
     self .presentViewController(picker!, animated: true, completion: nil)
   }
   else
   {
     let alertWarning = UIAlertView(title:"Warning", message: "You don't have camera", delegate:nil, cancelButtonTitle:"OK", otherButtonTitles:"")
     alertWarning.show()
   }
}
func openGallary()
{
   picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
   self.presentViewController(picker!, animated: true, completion: nil)
}

//PickerView Delegate Methods
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])
{
   picker .dismissViewControllerAnimated(true, completion: nil)
   imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
}
func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
   println("picker cancel.")
}
4
user3182143

画像ビューに適切なフレームがあり、画像ビューのコンテンツモードがアスペクトフィットであり、ピッカーから返される画像のタイプが[UIImagePickerControllerOriginalImage]であることを確認する必要があります

[imageView setFrame:imageViewRect];
[imageView setContentMode:UIViewContentModeScaleAspectFit];

Swift:

 imageView.setFrame(imageViewRect)
 imageView.setContentMode(UIViewContentModeScaleAspectFit)

allowsEditingプロパティに来る、それは写真の選択とは関係ありません。

これは、ユーザーが選択した静止画像または動画の編集を許可されているかどうかを示すブール値です。

カメラライブラリから写真を選択する場合は、ソースタイプを次のように変更する必要があります。

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

更新:

LETSは、1つの画像を選択し、それを画像ビューに表示すると言います。ビューに1つのimageviewがあり、imageviewフレームはビューフレームと等しいと仮定します。 IBがフリーフォームの場合、IBのイメージビューフレームのサイズは600x600と想定します。

あなたが単に行う場合:

     _startImageView.image=_img;

結果は次のようになります。

enter image description here

次に、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;

そして今、画像は次のようになります:

enter image description here

選択された元の画像のサイズは640x426、スケーリングされていない場合

選択された元の画像のサイズは1536x1286で、最大にスケーリングされたとき(2本の指でズームアクションを使用)

ご覧のように、画像に大きな変化はありませんこれは、画像が画像を受信するまでに画像が既にトリミング/スケーリングされているためです!!!

だからあなたがやろうとしても:

      [_img drawInRect:_startImageView.frame];

ピッカーによって与えられた画像はedited imageであるため、画像はその時点ですでにスケーリングされているため、必要に応じて画像は描画されません。

ソリューション:

これを修正するには、ピッカーからdidFinishPickingMediaWithInfo:メソッドで元の画像を選択する必要があります

       info[UIImagePickerControllerOriginalImage];

これはあなたにイメージを与えます:

enter image description here

3
Teja Nandamuri

このコードは、@ pkc456に比較的似ていますが、少し短くなっています。

これは私にとっては完璧に機能します:

   import UIKit

   class PostImageViewController: UIViewController,    UINavigationControllerDelegate, UIImagePickerControllerDelegate {

  @IBOutlet var imageToPost: UIImageView!

   @IBAction func chooseImage(sender: AnyObject) {

    var image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    image.allowsEditing = false //or true additional setup required.

    self.presentViewController(image, animated: true, completion: nil)

}

         func imagePickerController(picker: UIImagePickerController,    didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {



    self.dismissViewControllerAnimated(true, completion:nil)

}

これは機能しますか?

2
Lukesivi

私はxcode 7.1(Swift)に取り組んでおり、あなたのコードは適切であるとわかりました。また、私のプロジェクトに以下のコードを書いて、それは正常に動作しています。

func showPicker(){
    let type = UIImagePickerControllerSourceType.PhotoLibrary
    if(UIImagePickerController.isSourceTypeAvailable(type)){
        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        pickerController.allowsEditing = false
        self.presentViewController(pickerController, animated: true, completion: nil)
    }
}

func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
    let imageView = self.view.viewWithTag(20) as! UIImageView
    let selectedImage : UIImage = image
    imageView.image=selectedImage
    self.dismissViewControllerAnimated(true, completion: nil)
}

コードと私のコードの唯一の違いは、ImagePickerControllerインスタンスの可視性についてです。参考までに、私は次の場所にコードをアップロードします:- https://www.dropbox.com/s/pe0yikxsab8u848/ImagePicker-Swift.zip?dl=

私の考えは、コードを1度見ただけです。

1
pkc456

私にとっては解決し、モードをポップオーバーとして表示しました

  @IBAction func photoButton(sender: AnyObject) {

    imagePicker.allowsEditing = true
    imagePicker.sourceType = .PhotoLibrary

    let controller = self.imagePicker


    controller.modalPresentationStyle = UIModalPresentationStyle.Popover
    controller.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
    let popover = controller.popoverPresentationController

    popover?.sourceView = self
    controller.preferredContentSize = CGSize(
        width: self.frame.width * 0.6,
        height: self.frame.height * 0.6
    )

    popover?.sourceRect = CGRectMake(
        CGRectGetMidX(self.bounds),
        CGRectGetMidY(self.bounds),
        0,
        0
    )


    self.presentViewController(self.imagePicker, animated: true, completion: nil)
}
1

IBと自動レイアウトを使用しているようですが、適切な制約が設定されています。ストーリーボードに制約を追加してみてください。

1
MatthewLuiHK