Uso de UIImagePickerController en orientación horizontal

Estoy creando una aplicación que está en modo horizontal y estoy usando UIImagePickerController para tomar fotos con la cámara del iPhone y también quiero crearla en modo horizontal.

Pero como la documentación de Apple sugiere que UIImagePickerController no es compatible con la orientación horizontal, entonces, ¿qué debo hacer para obtener la funcionalidad deseada?

Si desea utilizar UIImagePickerController en modo horizontal, use la respuesta del usuario1673099 , pero en lugar de:

 - (BOOL)shouldAutorotate { return NO; } 

utilizar:

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; } 

y luego el selector se abriría en modo horizontal:

enter image description here

Pero asegúrese de marcar Portrait en la información de despliegue:

enter image description here

… y también quiero crearlo en modo paisaje.

¡Una línea de código puede marcar una gran diferencia! En el método o función donde aterriza su IBAction:

En Swift,

 let imagePickerController = UIImagePickerController() imagePickerController.delegate = self // .overCurrentContext allows for landscape and portrait mode imagePickerController.modalPresentationStyle = .overCurrentContext 

C objective,

 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; [imagePickerController setDelegate:self]; [imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext]; 

Nota: Esto permitirá que imagePickerController presente su vista correctamente, pero es posible que no solucione el problema de la rotación mientras se presenta.

Intenta de esta manera …

Según el documento de Apple, el controlador ImagePicker nunca gira en modo horizontal. Tienes que usar solo en el modo vertical.

Para deshabilitar el modo Paisaje solo para ImagePicker Controller, siga el siguiente código:

En su ViewController.m:

Haga la SubClass (NonRotatingUIImagePickerController) del Controlador de selector de imagen

 @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController // Disable Landscape mode. - (BOOL)shouldAutorotate { return NO; } @end 

Úselo como sigue

 UIImagePickerController* picker = [[NonRotatingUIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.delegate = self; etc.... Just as Default ImagePicker Controller 

Esto funciona para mí y avíseme si tiene algún problema.

La forma correcta de usar UIImagePickerController en modo horizontal sin ningún truco es colocarlo en un UIPopoverController

 - (void)showPicker:(id)sender { UIButton *button = (UIButton *)sender; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; _popover = [[UIPopoverController alloc] initWithContentViewController:picker]; [_popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 

Aquí hay una versión que admite rotación en todas las orientaciones de interfaz:

 /// Not fully supported by Apple, but works as of iOS 11. class RotatableUIImagePickerController: UIImagePickerController { override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .all } } 

De esta forma, si el usuario gira su dispositivo, actualizará el controlador del selector para que admita la orientación actual. Simplemente ejemplifique como lo haría normalmente con un UIImagePickerController.

Si solo desea admitir un subconjunto de orientaciones, puede devolver un valor diferente.

Esto funciona muy bien con Swift 4.0 en iOS 10/11.

 import UIKit extension UIImagePickerController { override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .all } } 

Simplemente suelte la extensión en algún lugar de su proyecto, sin necesidad de subclasificar nada para que funcione.

Si necesita especificar tipos de dispositivo, puede agregar un cheque como este:

 import UIKit extension UIImagePickerController { override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all } } 

Esto permitirá que un iPad gire libremente, pero aplica el modo de retrato en un teléfono. Solo asegúrese de que su aplicación esté configurada para admitir estos en su info.plist, de lo contrario, puede experimentar lockings al iniciar el selector.

Modificar el método de código anterior

 - (NSUInteger)supportedInterfaceOrientations { UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft) return UIInterfaceOrientationMaskLandscape; else return UIInterfaceOrientationMaskPortrait; } 

La respuesta aceptada no funciona para mí. También tuve que agregar modalPresentationStyle a UIImagePickerController para hacerlo funcionar.

 UIImagePickerController *pickerController = [[UIImagePickerController alloc] init]; pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; //this will allow the picker to be presented in landscape pickerController.delegate = self; pickerController.allowsEditing = YES; pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:pickerController animated:YES completion:nil]; 

Y, por supuesto, recuerde poner esto en un controlador que presente el selector:

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; //this will force landscape } 

Pero de acuerdo con la documentación de Apple, esto no es compatible para presentar este selector en el modo horizontal, así que tenga cuidado al respecto.