¿Cómo presentar UIImagePickerController o abrir la camera en una aplicación de solo paisaje?

Estoy creando una aplicación que solo funciona en modo horizontal.

Durante el logging, quiero abrir la camera o presentar un UIImagePickerController, pero la aplicación se bloquea con el siguiente error:

*** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES'

¿Cómo puedo presentar un selector de image o una camera en el paisaje?

 I found solution, case closed. i add in my appdelegate.m: -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) return UIInterfaceOrientationMaskAll; else /* iPad */ return UIInterfaceOrientationMaskAllButUpsideDown; } 

Tuve el mismo problema en iOS 9, y ninguna de las soluciones propuestas que encontré (aquí o en preguntas similares en SO) funcionó para mí. Pero, encontré una solución con el UIPopoverPresentationController que se introdujo en iOS 8. Esto es lo que estoy haciendo, en una aplicación que es solo retrato en iPhone y solo en paisaje en iPad. En el delegado de mi aplicación, tengo esto:

  func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { if UIDevice.currentDevice().userInterfaceIdiom == .Pad { return .Landscape } else { return .Portrait } } 

Luego, en el controller de vista que necesita mostrar el selector de fotos:

 @IBAction func choosePictureFromLibrary() { let imagePickerController = UIImagePickerController() imagePickerController.delegate = self // Set the presentation style and grab the presentation controller, // which is created for you. imagePickerController.modalPresentationStyle = .Popover let presentationController = imagePickerController.popoverPresentationController // You must set a sourceView or barButtonItem so that it can // draw a "bubble" with an arrow pointing at the right thing. presentationController?.sourceView = photoButton self.presentViewController(imagePickerController, animated: true) {} } 

El uso del estilo de presentación modal .Popover proporciona una vista bonita y compacta (básicamente del tamaño de un iPhone) que se superpone a la pantalla del iPad. Cuando se ejecuta en iPhone simplemente se ejecuta a pantalla completa como una vista modal normal.

Solución Swift 3 que funciona tanto para iPhone como para iPad

 func openGallary(_ sender:UIButton) { imagepicker?.delegate = self imagepicker?.allowsEditing = false imagepicker!.sourceType = UIImagePickerControllerSourceType.photoLibrary if UIDevice.current.userInterfaceIdiom == .phone { self.present(imagepicker!, animated: true, completion: nil) } else { imagepicker?.modalPresentationStyle = .popover let presentationController = imagepicker?.popoverPresentationController // You must set a sourceView or barButtonItem so that it can // draw a "bubble" with an arrow pointing at the right thing. presentationController?.sourceView = sender self.present(imagepicker!, animated: true) {} } } 

Implementar el método shouldAutorotate :

 - (BOOL)shouldAutorotate { UIInterfaceOrientation interfaceOrientation = [[UIApplication shanetworkingApplication] statusBarOrientation]; if (UIDeviceOrientationIsLandscape(interfaceOrientation)) { return YES; } return NO; } 

Esta imagen muestra la orientación del paisaje marcada, debe hacer lo mismo

Agregue este código a PUUIAlbumListViewController y a todos los demás controlleres de vista. Asegúrese de haber verificado solo el paisaje (paisaje a la izquierda y paisaje a la derecha) en su destino.