Подтвердить что ты не робот

UIImagePickerController на iPad с IOS9

Так как 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?

введите описание изображения здесь

4b9b3361

Ответ 1

Это ошибка от 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 {
}

Ответ 2

Обратитесь к приведенному ниже кодированию

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

Ответ 3

Вам нужно убедиться, что у вас есть правильный фрейм для вашего изображения, а contentmode для вашего изображения должен быть аспектным, а изображение, возвращаемое сборщиком, имеет тип [UIImagePickerControllerOriginalImage]

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

Swift:

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

и подходит к свойству allowsEditing, он не связан с выбором фото.

Это логическое значение, указывающее, разрешено ли пользователю редактировать выбранное неподвижное изображение или фильм.

Если вы хотите выбрать фотографии из библиотеки камер, вам необходимо изменить тип источника на

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

Update:

LEts говорит, что вы выбрали одно изображение и отобразите его на изображении. Я предполагаю, что у вас есть одно изображение на представлении, а рамка изображения равна рамке представления. Если IB имеет произвольную форму, я предполагаю размер 600x600 для кадра изображения в IB.

если вы просто выполните:

     _startImageView.image=_img;

Результат будет:

введите описание изображения здесь

Теперь сделаем некоторые изменения изображения, которое будет отображаться в представлении изображения:

  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];

который дает вам изображение:

введите описание изображения здесь

Ответ 4

Этот код относительно похож на @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)

}

Это работает?

Ответ 5

Я работаю над 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=0

Моя идея - просто взглянуть на мой код один раз, возможно, вы получите представление о том, какой раздел вашего кода неисправен.

Ответ 6

Кажется, вы используете IB и автоматический макет, но установили правильное ограничение. Попробуйте добавить некоторые ограничения в раскадровку.

Ответ 7

для меня я был решен, показывая режим как popover

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