Pregunta

Tengo un UITabBarController, y cada pestaña maneja una UIViewController diferente que empuja en la pila nuevos controladores, según sea necesario. En dos de estas pestañas que necesito, cuando se alcanza un controlador específico, la capacidad de rotar el iPhone y visualizar una vista en modo horizontal. Después de luchar mucho que he encontrado que es UITabBarController subclases obligatoria para anular shouldAutorotateToInterfaceOrientation. Sin embargo, si i simplemente devuelva SÍ en la implementación, se plantea el siguiente efecto secundario indeseable:

todos los controladores de cada pestaña se pone automáticamente en modo horizontal al girar el iPhone.

shouldAutorotateToInterfaceOrientation Incluso imperiosa de cada controlador para volver NO no funciona:. Cuando se gira el iPhone, el controlador se pone en modo horizontal

he implementado shouldAutorotateToInterfaceOrientation como sigue en el UITabBarController subclase:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

Así que sólo las dos pestañas Estoy interesado en conseguir realmente soporte para el modo paisaje. ¿Hay una manera de apoyar el modo de paisaje para un controlador específico sobre la pila de una pestaña en particular?

He intentado, sin éxito, algo así como

(BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

Además, he intentado usar el método delegado didSelectViewController, sin éxito. Cualquier ayuda es muy apreciada. Gracias.

¿Fue útil?

Solución

Esto funcionó para mí:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

Otros consejos

Esta es una extensión para que los delegados UITabBarController llamadas a shouldAutorotateToInterfaceOrientation al controlador niño seleccionado en ese momento. El uso de esta extensión, no es necesario subclase UITabBarController más y se puede utilizar en shouldAutorotateToInterfaceOrientation sus controladores como uno esperaría.

UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITabBarController + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

He sido capaz de utilizar este hace un tiempo (desde el controlador de la barra de pestañas de mi aplicación) sin problemas:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

De este modo, en la CV apropiada, tenemos que hacer la real cheque, en este caso para una vista galería de fotos (¿qué otra cosa?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Mi opinión galería no está a la pila más alto de un controlador de navegación determinada. Todavía se llama.

Por desgracia, acabo de descubrir que este no el trabajo tan bien cuando la VC se esconde dentro de la MoreViewController (en contraposición a las cuatro pestañas principales). En ese caso, mi galería VC nunca se llama. Creo que es debido a que el VC He estado llamando todo el tiempo es realmente el controlador de navegación de la pestaña seleccionada, que después propaga las cosas a la VC sea apropiado, en este caso mi galería de fotos VC. Pero para los más VC, las cosas no funcionan tan bien ... Aaaand las cosas van rotación cuesta abajo desde allí. : \

I intentado utilizar las modificaciones de Andreas (ver en este hilo en otra parte), sin ningún resultado. Las pistas son bienvenidos!

Me encontré con los mismos problemas como lo hizo cuando se trabaja con la UITabBarController. Que necesitaba para controlar qué UIViewControllers se permitió a girar y que no lo eran. Mi principal problema fue con la pestaña MÁS. No quería que ninguno de los UIViewControllers incluidos en la pestaña MÁS para girar.

Mi solución fue crear mi propia UITabBarController que he llamado MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

A continuación, he implementado el método shouldAutorotateToInterfaceOrientation:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

que necesitaba para descubrir si se ha seleccionado la pestaña MÁS. Este es un proceso de dos pasos; cuando se selecciona la pestaña MÁS inicialmente el API devuelve un selectedIndex mayor que 4, así que necesitaba para comparar el controlador seleccionado con el moreNavigationController.

Si se selecciona un UIViewController desde la pestaña MÁS entonces el selectedIndex es, finalmente, 4 pero el selectedController no es el más moreNavigationController pero el UIViewController seleccionado.

La if ((controlador == [libre moreNavigationController]) || ([libre selectedIndex] == 4)) se ocupa de este problema.

Ahora, cuando corro mi solicitud mis UIViewControllers en la pestaña MAS no son rotados. Espero que esto ayudará a otros desarrolladores que se están ejecutando en los mismos problemas que yo.

Emilio

Por lo que he visto aquí y en otros lugares que he cosido juntos una solución que utiliza el método shouldAutorotate ya que el antiguo shouldAutorotateToInterfaceOrientation ya no se utiliza.

He colocado dentro de una categoría a UITabBarController. Yo espero que este modo es admisible!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

Gracias, Gracias, Gracias. Esto ha sido 2 días en encontrar la manera de hacer esto. Aquí está mi opinión sobre la totalidad de su gran ayuda cuando se tiene un tabBarController con navigationControllers.

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

Cualquier crítica de código de un codificador neophite es siempre apreciada ... jack

¿Es realmente bien a la subclase UITabBarController (como se sugiere en la respuesta aceptada arriba)?

he entendido que las manzanas dice algo así como "que nunca debe subclase UITabBarController o UINavigationController" -? O he entendido mal

De todos modos; He encontrado este tutorial donde subclases un UIViewController en la que le pusieron un UITabBarController.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top