UIImagePickerController على iPad مع IOS9




swift (5)

أنا أعمل على xcode 7.1 (سويفت) ووجدت شفرتك مناسبة. كتبت أيضًا الشفرة التالية في مشروعي وهي تعمل بنجاح.

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=0

فكرتي هي مجرد إلقاء نظرة على الرمز الخاص بي مرة واحدة ، ربما ستحصل على فكرة حول أي قسم من الكود معطّل.

منذ iOS 9 و Xcode 7 لم أعد قادرًا على تنفيذ UIImagePickerController على جهاز iPad (جهاز ومحاكي). يعمل الرمز أدناه على جهاز 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
            })    

}

هيريس مثال لصورة مختارة في UIImagePickerController. (لاحظ كيف يتم عرض الصورة المحددة صغيرة جدًا وليس بالحجم الكامل / عرض الشاشة كما كان من قبل)

بعد تحديد زر الاستخدام داخل UIImagePickerController فإن الصورة النهائية هي أعلى يمين الصورة الأصلية فقط. ماذا أفعل الخطأ أو هل UIImagePickerController مكسور على iOS 9؟


الرجوع إلى الترميز أدناه

@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.")
}

هذا الرمز مشابه نسبيًا لـ @ 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)

}

هل هذا فعال؟


هذا خطأ من Apple: http://openradar.appspot.com/radar?id=5032957332946944

الحل الحالي الرديء:

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

سويفت 3.0:

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

يجب أن تتأكد من أنك تمتلك الإطار الصحيح لعرض الصورة الخاص بك ويجب أن يكون contentmode الخاص بـ imageview خاصتك وأن تكون الصورة التي يتم إرجاعها بواسطة المنتقي من النوع [UIImagePickerControllerOriginalImage]

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

سويفت:

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

allowsEditing خاصية allowsEditing الإقامة ، لا يتعلق باختيار الصور.

وهي قيمة منطقية تشير إلى ما إذا كان يُسمح للمستخدم بتحرير صورة ثابتة أو فيلم ثابت.

إذا كنت ترغب في تحديد الصور من مكتبة الكاميرا ، فأنت بحاجة إلى تعديل نوع المصدر

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

تحديث:

يقول LEts أنك قمت بتحديد صورة واحدة وعرضها في عرض الصورة. أفترض أن لديك صورة مصورة واحدة في العرض ، وأن إطار imageview يساوي إطار العرض. إذا كان IB هو حر ، أفترض حجم 600x600 للإطار imageview في IB.

إذا كنت تفعل ببساطة:

     _startImageView.image=_img;

ستكون النتيجة:

لنقم الآن بإجراء بعض التغييرات على الصورة المراد عرضها في 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;

والآن ستكون الصورة:

الصورة الأصلية المختارة هي بحجم 640x426 ، عندما لا يتم تحجيمها .

الصورة الأصلية المختارة هي بحجم 1536x1286 عند تحجيمها إلى الحد الأقصى (مع إجراء تكبير / تصغير إصبعين) .

كما ترون ، لا يزال لا يوجد تغيير كبير في الصورة ، لأن الصورة قد تم اقتصاصها / قياسها في الوقت الذي حصلت فيه الصورة على الصورة !

لذلك على الرغم من أنك تحاول القيام بما يلي:

      [_img drawInRect:_startImageView.frame];

لن يتم رسم الصورة حسب احتياجنا ، حيث أن الصورة يتم تصغيرها مباشرة في هذه اللحظة حيث أن الصورة التي يقدمها المنتقي هي edited image .

حل:

لإصلاح هذا ، تحتاج إلى تحديد الصورة الأصلية من المنتقى في طريقة didFinishPickingMediaWithInfo:

       info[UIImagePickerControllerOriginalImage];

الذي يعطيك الصورة:





uiimagepickercontroller