tutorial tab objective bar apple objective-c rotation uitabbarcontroller ios6

objective c - objective - Problemas de rotación de UITabBarController en iOS 6



uikit ios (8)

Debe agregar esto en UIViewController1.m para asegurarse de que se reconstruya el estado de orientación anterior:

(void)viewDidAppear:(BOOL)animated { [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait]; }

¡Perfecto!

Ack! Mis problemas de rotación de la barra de pestañas se resolvieron finalmente en iOS 5, pero iOS 6 y xcode parecen haber roto cosas ... esto es lo que tengo

El resumen de la aplicación de destino incluye: Orientaciones de interfaz admitidas - Portraint, Horizontal izquierda, Horizontal derecha

Cada vista única en la aplicación tiene los siguientes métodos:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return ((interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown) && (interfaceOrientation != UIInterfaceOrientationLandscapeLeft) && (interfaceOrientation != UIInterfaceOrientationLandscapeRight)); } else { return YES; } } - (BOOL)shouldAutorotate { NSLog(@"am I called1?"); return NO; } -(NSUInteger)supportedInterfaceOrientations{ NSLog(@"am I called?"); return UIInterfaceOrientationMaskPortrait; }

En las vistas que no forman parte de la barra de pestañas, la rotación está bloqueada. En TODAS las vistas de la barra de pestañas (hay 5) la aplicación nunca llama a ShouldAutorotate y, por lo tanto, gira. Parece que se admite una vez que se llama InterInterfaceOrientations cuando se carga una vista, pero no cuando aparece si cambio entre las vistas, porque obtengo el NSLog, pero parece ignorar la configuración de MaskPortrait.

Tengo que dejar el paisaje habilitado en el objetivo porque tengo una sola vista de reproductor de video que necesita girar (y lo hace, está bien)

¿Es este un error de la barra de pestañas en iOS 6? ¿Necesito desactivar la rotación de las vistas de manera diferente? El manual debería funcionar bien en ios 5

He estado en eso por un tiempo

Gracias zack


En mi caso, tenía un controlador de navegación incorporado dentro de un UITabBarController, y lo que funcionó fue crear una categoría como la que definió Kunani, pero extendiendo el UITabBarController en lugar de UINavigationController. Funcionó a las mil maravillas :)

#import "UINavigationController+autoRotate.h" @implementation UINavigationController (autoRotate) -(BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end

Y el archivo .h:

#import <UIKit/UIKit.h> @interface UINavigationController (autoRotate) -(BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; @end


Esto lo hará en Swift.

extension UITabBarController { public override func shouldAutorotate() -> Bool { if let selected = self.selectedViewController { return selected.shouldAutorotate() } else { return false } } public override func supportedInterfaceOrientations() -> Int { if let selected = self.selectedViewController { return selected.supportedInterfaceOrientations() } else { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } } } extension UINavigationController { public override func shouldAutorotate() -> Bool { return self.visibleViewController.shouldAutorotate() } public override func supportedInterfaceOrientations() -> Int { return self.visibleViewController.supportedInterfaceOrientations() } }


Si tiene una barra de pestañas como la que tenía yo, lo único que debe hacer es agregar lo siguiente a su archivo .m delegado,

#import "AppDelegate.h" //UITabBarController category to set the view rotations for ios 6 @implementation UITabBarController (Background) -(BOOL)shouldAutorotate { //I don''t want to support auto rotate, but you can return any value you want here return NO; } - (NSUInteger)supportedInterfaceOrientations { //I want to only support portrait mode return UIInterfaceOrientationMaskPortrait; } @end /////here starts the implementation of the app delegate which is gonna be whatever you currently have on your .m delegate @implementation AppDelegate // delegate methods and other stuff @end


También tuve el problema de que necesitaba algunas vistas para rotar y otras no con varios controladores de navegación. Hice esto diciéndole al controlador de navegación que busque en el controlador de vista. Aquí esta lo que hice.

Creo una clase UINavigationController llamada RootNavigationController y designé a esa clase como la Clase personalizada para los controladores de navegación en el guión gráfico. En el RootNavigationController.m agregué los siguientes métodos;

- (BOOL)shouldAutorotate { return [self.visibleViewController shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.visibleViewController supportedInterfaceOrientations]; }

En cada archivo .m de controlador de vista también agregué los siguientes métodos.

- (BOOL)shouldAutorotate { //return yes or no } - (NSUInteger)supportedInterfaceOrientations{ //return supported orientation masks }

Hacer esto me permite establecer la orientación para cada vista en su controlador de vista.

Trabajó para mí de todos modos ...


Zack, me encontré con este mismo problema. Es porque tiene su viewController incorporado dentro de un TabBar Controller o UINavigationController y las llamadas a estos métodos se realizan dentro de esos en lugar de su vista normal (modificada en iOS6).

Me encontré con este problema porque presentaba un viewController integrado dentro de un UINavigationController en todas mis vistas modales que tenían navegación a diferentes vistas (proceso de suscripción, inicio de sesión, etc.).

Mi solución simple fue crear una CATEGORÍA para UINavigationController que incluye estos dos métodos. De todos modos, tengo que hacer una Autorización para devolver NO, ya que no quiero que se alternen mis vistas modales. Su solución puede ser tan simple, inténtelo. Espero eso ayude.

Creé una categoría y la llamé autoRotate y seleccioné la opciónUINavigationController. Los archivos de M + H están abajo.

#import "UINavigationController+autoRotate.h" @implementation UINavigationController (autoRotate) -(BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end

... y la categoría .h:

#import <UIKit/UIKit.h> @interface UINavigationController (autoRotate) -(BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; @end


Mi situación es:

  • UITabBarController tiene 2 elementos: 2 Controlador de navegación
  • UINavigationController1 withRootView: ViewController1
  • UINavigationController2 withRootView: ViewController2.
  • Ahora quiero que ViewController1 set shouldAutorotate: NO / maskPortrait y ViewController2 set shouldAutorotate / MaskAll.

Así que mi implemento: Crear la categoría UITabBarController y la categoría UINavigationCntroller como

UITabBarController + autoRotate.h

@interface UITabBarController (autoRotate) -(BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; @end

UITabBarController + autoRotate.m

#import "UITabBarController+autoRotate.h" @implementation UITabBarController (autoRotate) - (BOOL)shouldAutorotate { return [self.selectedViewController shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.selectedViewController supportedInterfaceOrientations]; } @end

UINavigationController + autoRotate.h

@interface UINavigationController (autoRotate) -(BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; @end

UINavigationController + autoRotate.m

@implementation UINavigationController (autoRotate) - (BOOL)shouldAutorotate { return [self.visibleViewController shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.visibleViewController supportedInterfaceOrientations]; } @end

UIViewController1.m

- (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait;; }

UIViewController2.m

- (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; }

¡Funcionó a las mil maravillas!


https://.com/a/30632505/2298002

hay muchos resultados ambiguos o imprevistos cuando se maneja esta situación, especialmente cuando se trata de mantener la orientación solo para un controlador de vista específico y no afecta al resto de la aplicación. Este algoritmo parece entregarme todo por mí.

https://.com/a/30632505/2298002