uiimagepickercontrollerdelegate - UIImagePickerController en iPad con IOS9
uiimagepickercontrollerdelegate swift 4 (7)
Desde iOS 9 y Xcode 7, ya no puedo implementar un UIImagePickerController en un iPad (dispositivo y simulador). El siguiente código funciona en el iPad, pero solo antes de iOS 9. Cuando se usa iOS 9+, la imagen presentada (después de que se descarta el UIImagePickerController) es una versión incorrecta de la imagen seleccionada. Sin cambiar el tamaño o recortar, ¿la imagen final es solo la esquina superior derecha de la imagen original? Además de otro problema: si imagePicker.allowsEditing = false, ¿no puede seleccionar imágenes de 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
})
}
Aquí hay un ejemplo de una imagen seleccionada presentada en un UIImagePickerController. (observe cómo la imagen seleccionada se presenta muy pequeña y no tiene el tamaño / ancho completo de la pantalla como antes)
Después de seleccionar el botón de uso dentro del UIImagePickerController, la imagen final es solo la parte superior derecha de la imagen original. ¿Qué estoy haciendo mal o UIImagePickerController está roto en iOS 9?
Consulte la codificación a continuación
@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.")
}
Debes asegurarte de tener el fotograma correcto para tu vista de imagen y el modo de contenido para tu vista de imagen debe estar ajustado y la imagen devuelta por el selector es del tipo [UIImagePickerControllerOriginalImage]
[imageView setFrame:imageViewRect];
[imageView setContentMode:UIViewContentModeScaleAspectFit];
Rápido:
imageView.setFrame(imageViewRect)
imageView.setContentMode(UIViewContentModeScaleAspectFit)
y llegar a la propiedad allowsEditing
, no está relacionado con la selección de fotos.
Es un valor booleano que indica si el usuario tiene permiso para editar una imagen fija o película seleccionada.
Si desea seleccionar fotos de la biblioteca de la cámara, debe modificar el tipo de fuente para
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
Actualizar:
Dice que ha seleccionado una imagen y la muestra en la vista de la imagen. Supongo que tiene una vista de la imagen en la vista, y el marco de la vista de la imagen es igual al marco de la vista. Si el IB es de forma libre, supongo que el tamaño 600x600 para el marco de la vista de imagen en el IB.
si simplemente lo haces:
_startImageView.image=_img;
El resultado será:
Ahora hagamos algunos cambios a la imagen que se mostrará en la vista de imagen:
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;
y ahora la imagen será:
La imagen original elegida es del tamaño 640x426, cuando no está escalada .
La imagen original seleccionada tiene un tamaño de 1536x1286 cuando se escala al máximo (con dos dedos de acción de zoom) .
Como puede ver, todavía no hay un gran cambio en la imagen, ¡ es porque la imagen ya está recortada / escalada cuando su imagen recibió la imagen !
Entonces, aunque intentes hacer:
[_img drawInRect:_startImageView.frame];
La imagen no se dibujará según nuestra necesidad, ya que la imagen ya está escalada en ese momento dado que la imagen edited image
es la edited image
el selector ha elegido.
Solución:
Para solucionar esto, debe seleccionar la imagen original del selector en el método didFinishPickingMediaWithInfo:
info[UIImagePickerControllerOriginalImage];
que te da la imagen:
Este código es relativamente similar a @ pkc456, solo un poco más corto.
Esto funciona perfectamente para mi:
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)
}
¿Esto funciona?
Este es un error de Apple: http://openradar.appspot.com/radar?id=5032957332946944
Solución actual pésima:
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
imagePicker.allowsEditing = false
} else {
imagePicker.allowsEditing = true
}
Swift 3.0:
if UIDevice.current.userInterfaceIdiom == .pad {
}
Estoy trabajando en xcode 7.1 (Swift) y encontré tu código apropiado. También escribí el código a continuación en mi proyecto y está funcionando con éxito.
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)
}
La única diferencia en su código y mi código es sobre la visibilidad de la instancia de ImagePickerController
. Para su referencia, cargo mi código en: https://www.dropbox.com/s/pe0yikxsab8u848/ImagePicker-Swift.zip?dl=0
Mi idea es solo mirar mi código una vez, puede ser que tengas una idea acerca de qué sección del código funciona mal.
Parece que está utilizando IB y el diseño automático, pero ha establecido una restricción correcta. Intenta agregar alguna restricción en tu guión gráfico.
para mí estaba resuelto, mostrando el modo como 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)
}