ios objective-c uiimagepickercontroller landscape uiimageorientation

ios - Usando UIImagePickerController en orientación horizontal



objective-c landscape (8)

... y quiero crearlo también en modo paisaje.

¡Una línea de código puede hacer una gran diferencia! En el método o función donde aterriza tu acción de IB:

En Swift,

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

C objetivo,

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

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

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 admite la orientación horizontal, ¿qué debo hacer para obtener la funcionalidad deseada?


Aquí hay una versión que admite la 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 manera, si el usuario gira su dispositivo, actualizará el controlador del selector para admitir la orientación actual. Solo crea una instancia como lo harías 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, no necesita subclasificar nada para que funcione.

Si necesita especificar tipos de dispositivo, puede agregar una verificación como esta:

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 retrato en un teléfono. Solo asegúrese de que su aplicación esté configurada para admitir estos en su lista de información, de lo contrario, podría encontrar bloqueos al iniciar el selector.


Intenta de esta manera ...

Según el documento Apple, el controlador ImagePicker nunca rota en modo horizontal. Tienes que usar en modo retrato solamente.

Para deshabilitar el modo horizontal solo para el controlador ImagePicker, siga el siguiente código:

En su ViewController.m:

Cree la subclase (NonRotatingUIImagePickerController) del controlador Image Picker

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

Usar como sigue

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

Esto está funcionando para mí. Avísame si tienes algún problema.


La forma correcta de usar UIImagePickerController en modo horizontal sin ningún hacks es ponerlo 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]; }


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

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, recuerda poner esto en un controlador que presenta el selector:

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

Pero de acuerdo con la documentación de Apple, esto no se admite para presentar este selector en modo horizontal, así que ten cuidado.


Si desea usar UIImagePickerController en modo horizontal, use la respuesta de user1673099 , pero en lugar de:

- (BOOL)shouldAutorotate { return NO; }

utilizar:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; }

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

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


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; }