2012-01-26 15 views
17

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.¿Cómo usar UIImagePickerController en iPad?

Ahora el problema es que está funcionando bien en el iPhone, pero cuando intento abrir el álbum de fotos se bloquea. 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.

+0

Si alguien Dedica entonces también escribe su razón, porque he intentado primero averiguarlo pero nada me ayudó, es por eso que hice esta pregunta aquí – Mashhadi

+0

¿Cuál es la excepción? Si es memoria, ¿has probado NSZombiesEnabled? – gerry3

+0

"Programa recibido señal SIGABRT" esta es la excepción – Mashhadi

Respuesta

56

UIImagePickerControllerdebe se presentará 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: Añadir una fuerte propiedad para el UIPopoverController:

@property (nonatomic, strong) UIPopoverController *popOver; 

El popover debe ser desestimado en los métodos de delegado:

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

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
+0

esta respuesta es incompleta. ¿Qué es self.popOver? no hay definición de esto en el código presentado –

+7

No es tan incompleto, solo tiene que leer entre líneas ... Obviamente self.popOver es una propiedad de tipo 'UIPopoverController', que presumiblemente se usa para manejar el cierre de la ventana emergente después . Solo digo – mprivat

+3

No, está incompleto. Si se supone que debemos "leer entre líneas", al menos necesitamos una dirección para "leer". Este es un foro de aprendizaje. Felicitaciones por su experiencia de iOs pero no es necesario ser grosero. – edthethird

5

Los documentos de Apple dicen

"Present the user interface by calling the presentViewController:animated:completion: method of the currently active view controller, passing your configured image picker controller as the new view controller. On iPad, present the user interface using a popover. Doing so is valid only if the sourceType property of the image picker controller is set to UIImagePickerControllerSourceTypeCamera."

Eso dice exactamente lo contrario de cómo se comporta?!? Usted CANTE UIImagePickerControllerSourceTypeCamera de un popover y CAN presente UIImagePickerControllerSourceTypePhotoLibrary y UIImagePickerControllerSourceTypeSavedPhotosAlbum de forma modal.

extraño ...

6

Aquí os muestro el camino 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) 
    } 
} 
2

POSTAL iOS 8: Try controlador Popover añadiendo en

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

Motivo: Este es porque 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.

0

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 objetivo 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.

Cuestiones relacionadas