¿Cómo usar UIImagePickerController en iPad?

Hola, estoy trabajando en una aplicación universal (iPhone / iPad). Una característica es que tengo que seleccionar una foto del álbum y mostrarla en UIImageView.

Ahora el problema es que está funcionando bien en iPhone, pero cuando bash abrir el álbum de fotos, falla. mi código en el delegado de la hoja de acción es este:

- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) { if (buttonIndex == 0) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; [self presentModalViewController:imagePicker animated:YES]; } if (buttonIndex == 1) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:imagePicker animated:YES]; } } else { if (buttonIndex == 0) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:imagePicker animated:YES]; } } } else{ if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) { if (buttonIndex == 0) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; [self presentModalViewController:imagePicker animated:YES]; } if (buttonIndex == 1) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:imagePicker animated:YES]; } } else { if (buttonIndex == 0) { [self lockAllImagesOnTheScreen]; imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:imagePicker animated:YES]; } } } } 

¿Alguien puede ayudarme? He comprobado en stackOverflow y también en Google, pero en vano.

UIImagePickerController debe ser presentado con UIPopoverController en iPad.

 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; [popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; self.popOver = popover; } else { [self presentModalViewController:picker animated:YES]; } 

EDITAR : agrega una propiedad fuerte para UIPopoverController :

 @property (nonatomic, strong) UIPopoverController *popOver; 

El popover debe descartarse en los métodos delegates:

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 

Aquí te muestro la manera SWIFT:

 import UIKit class StoreItemViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var button: UIButton! @IBOutlet weak var productImage: UIImageView! var popOver:UIPopoverController? @IBAction func buttonSelected(sender:UIButton) { if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum) { var imagePickerController = UIImagePickerController() imagePickerController.delegate = self imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum imagePickerController.allowsEditing = false if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad { self.popOver = UIPopoverController(contentViewController: imagePickerController) self.popOver?.presentPopoverFromRect(self.productImage.bounds, inView: self.productImage, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true) } else { self.presentViewController(imagePickerController, animated: true, completion: { imageP in }) } } } func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { //do anything with the image let selectedImage = info[UIImagePickerControllerOriginalImage] as UIImage //closing the popup popOver?.dismissPopoverAnimated(true) } func imagePickerControllerDidCancel(picker: UIImagePickerController) { println("cancel") //closing the popup popOver?.dismissPopoverAnimated(true) } } 

Los doctores de Apple dicen

“Presente la interfaz de usuario llamando al método presentViewController: animated: completion: del controlador de vista actualmente activo, pasando su controlador de selector de imágenes configurado como el nuevo controlador de vista. En iPad, presente la interfaz de usuario utilizando un popover. Hacerlo es válido solamente si la propiedad sourceType del controlador del selector de imágenes está configurada en UIImagePickerControllerSourceTypeCamera. ”

Eso dice exactamente lo contrario de cómo se comporta?!? Puede CANT presentar UIImagePickerControllerSourceTypeCamera desde un popover y UIImagePickerControllerSourceTypePhotoLibrary presente UIImagePickerControllerSourceTypePhotoLibrary y UIImagePickerControllerSourceTypeSavedPhotosAlbum .

Extraño…

POST iOS 8: prueba agregar el controlador popOver en

[[NSOperationQueue mainQueue] addOperationWithBlock: ^ {}];

Motivo: Esto se debe a que en iOS 8, las vistas de alerta y las hojas de acción se presentan en realidad controladores de vista (UIAlertController). Por lo tanto, si presenta un nuevo controlador de vista en respuesta a una acción de UIAlertView, se presentará mientras se descarta el UIAlertController. Debe hacerlo en la cola principal sin alterar la navegación.

Si el dispositivo es iPad y se especifica el tipo de fuente ‘photoLibrary’ o ‘savedPhotosAlbum’, UIImagePickerController debe mostrarse popover de acuerdo con los documentos de Apple. En mi caso, logro mi objective de esta manera;

 func choosePhotoFromLibrary() { let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary imagePicker.delegate = self imagePicker.allowsEditing = true if UIDevice.current.userInterfaceIdiom == .pad { imagePicker.modalPresentationStyle = .popover present(imagePicker, animated: true, completion: nil) let imagePickerPopOverPresentationController = imagePicker.popoverPresentationController imagePickerPopOverPresentationController?.permittedArrowDirections = .up let photoPickingTableCell = tableView.cellForRow(at: IndexPath(row: 2, section: 0)) imagePickerPopOverPresentationController?.sourceView = photoPickingTableCell imagePickerPopOverPresentationController?.sourceRect = profilePhotoImageView.frame } else { present(imagePicker, animated: true, completion: nil) } } 

Tengo una celda de vista de tabla que incluye una vista de imagen. La selección de esa celda necesita abrir el controlador del selector de imágenes, por lo que las llamadas se eligen en el método PhotoFromLibrary. En este método, si el dispositivo es pad, asigne popover de estilo de presentación del selector de imágenes y preséntelo. Luego, configure el comportamiento de popover. En mi caso, mi sourceView es la celda de la tabla que incluye la vista de la imagen, y mi sourceRect es el marco de la vista de la imagen.

También puede beneficiarse de los métodos UIPopoverPresentationControllerDelegate si asigna un delegado.