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?
![введите описание изображения здесь]()
Ответы
Ответ 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)
}