sacar rapido plus llama inferior editar customize control como centro barra aparece acceso ios rotation ios6 screen-rotation

rapido - rotaciones de iOS 6: supportedInterfaceOrientations no funciona?



editar centro de control ios 11 (9)

@ Respuesta de Alvivi actualizada para Swift 4 .

extension UINavigationController { // Look for the supportedInterfaceOrientations of the topViewController // Otherwise, viewController will rotate irrespective of the value returned by the ViewController override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { if let ctrl = self.topViewController { return ctrl.supportedInterfaceOrientations } return super.supportedInterfaceOrientations } // Look for the shouldAutorotate of the topViewController // Otherwise, viewController will rotate irrespective of the value returned by the ViewController override open var shouldAutorotate: Bool { if let ctrl = self.topViewController { return ctrl.shouldAutorotate } return super.shouldAutorotate } }

Tengo este problema con iOS 6 SDK: estoy teniendo algunas opiniones que deberían poder rotar (por ejemplo, una videoview), y otras que no. Ahora entiendo que tengo que verificar todas las orientaciones en Info.plist de la aplicación y luego ordenar en cada ViewController, lo que debería suceder. ¡Pero no funciona! La aplicación siempre gira a las orientaciones, que se dan en Info.plist.

Info.plist:

<key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array>

cualquier ViewController que no debe permitirse rotar:

//deprecated - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; }

Observación: la aplicación gira hacia la orientación horizontal y vertical. ¿Alguna idea de por qué o qué estoy haciendo mal?

Saludos, Marc

Editar: mis últimos hallazgos también indican que si desea tener rotación en algún punto de su aplicación, debe activar las cuatro direcciones de rotación en la configuración de su proyecto o Info.plist. Una alternativa a esto es anular

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

en su AppDelegate, que anula el Info.plist. Ya no es posible configurar Portrait en su Info.plist y luego tener rotación en ViewController anulando shouldAutorotateToInterfaceOrientation o supportedInterfaceOrientations.


Añadiendo a la respuesta de CSmith anterior, el siguiente código en una subclase UINavigationController permite la delegación al controlador de vista superior en la forma en que esperaba que esto funcionara en primer lugar:

- (BOOL)shouldAutorotate; { return YES; } - (NSUInteger)supportedInterfaceOrientations { if ([[self topViewController] respondsToSelector:@selector(supportedInterfaceOrientations)]) return [[self topViewController] supportedInterfaceOrientations]; else return [super supportedInterfaceOrientations]; }


Además de @CSmith y @EvanSchoenberg.

Si tiene algunas vistas que giran, y algunas que no, debe crear una instancia personalizada del UITabBarController , y aun así dejar que cada UIViewController decida.

- (BOOL)shouldAutorotate; { return YES; } - (NSUInteger)supportedInterfaceOrientations { UIViewController * top; UIViewController * tab = self.selectedViewController; if([tab isKindOfClass: ([UINavigationController class])]) { top = [((UINavigationController *)tab) topViewController]; } if ([top respondsToSelector:@selector(supportedInterfaceOrientations)]) return [top supportedInterfaceOrientations]; else return [super supportedInterfaceOrientations]; }


Aquí hay otra alternativa al enfoque de CSmith.

Si desea replicar el comportamiento previo a iOS 6 donde todas las vistas en la barra de pestañas / pila de navegación tienen que ponerse de acuerdo sobre un conjunto de orientaciones permitidas, colóquelo en su subclase de UITabBarController o UINavigationController :

- (NSUInteger)supportedInterfaceOrientations { NSUInteger orientations = [super supportedInterfaceOrientations]; for (UIViewController *controller in self.viewControllers) orientations = orientations & [controller supportedInterfaceOrientations]; return orientations; }


Como una opción alternativa, en caso de que desee conservar la funcionalidad de rotación anterior a iOS6 en su aplicación:

Aquí hay un fragmento de código útil sobre github que descifra las llamadas de método para iOS6, de modo que la rotación funciona como en iOS4 / iOS4. Esto realmente me ayudó, ya que estoy apoyando una aplicación heredada que realmente micro-gestiona sus rotaciones. Hubiera sido mucho trabajo implementar los cambios necesarios para iOS6. Felicitaciones al usuario que lo publicó.

https://gist.github.com/3725118


Intenta agregar esta categoría:

@interface UINavigationController(InterfaceOrientation) @end @implementation UINavigationController(InterfaceOrientation) - (NSUInteger) supportedInterfaceOrientations { if (self.viewControllers.count > 0) return [[self.viewControllers objectAtIndex:0] supportedInterfaceOrientations]; else return UIInterfaceOrientationMaskAll; } @end


La respuesta de @Shimanski Artem es buena, pero creo que usar el controlador más alto (actualmente visible) es una mejor solución:

@interface UINavigationController(InterfaceOrientation) @end @implementation UINavigationController(InterfaceOrientation) - (NSUInteger) supportedInterfaceOrientations { if (self.viewControllers.count > 0){ return [[self.viewControllers objectAtIndex:[self.viewControllers count] - 1] supportedInterfaceOrientations]; } return UIInterfaceOrientationMaskAll; } @end


Para las personas que usan UINavigationController y Swift, puede agregar esta extensión a su proyecto. Después de eso, los controladores de navegación delegan el control a su controlador hijo.

extension UINavigationController { override public func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { if let ctrl = topViewController { return ctrl.supportedInterfaceOrientations() } return super.supportedInterfaceOrientations() } override public func shouldAutorotate() -> Bool { if let ctrl = topViewController { return ctrl.shouldAutorotate() } return super.shouldAutorotate() } }


Si su ViewController es hijo de un UINavigationController o UITabBarController, entonces es el padre el que es su problema. Es posible que necesites crear una subclase de ese controlador de vista padre, anulando esos métodos de InterfaceOrientation como lo has mostrado en tu pregunta

EDITAR:

Ejemplo solo para el retrato TabBarController

@interface MyTabBarController : UITabBarController { } @end @implementation MyTabBarController // put your shouldAutorotateToInterfaceOrientation and other overrides here - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; } @end