Pergunta

Eu tenho um UITabBarController, e cada guia lida com uma UIViewController diferente que coloca na pilha novos controladores, conforme necessário. Em duas destas guias que preciso, quando um controlador específico é atingido, a capacidade de girar o iPhone e visualizar uma vista em modo paisagem. Depois de lutar muito eu descobri que é obrigatório subclasses UITabBarController para shouldAutorotateToInterfaceOrientation override. No entanto, se eu simplesmente retornar SIM na implementação, o seguinte efeito colateral indesejável surge:

cada controlador em cada guia é automaticamente colocado no modo paisagem quando girar o iPhone.

Mesmo substituindo shouldAutorotateToInterfaceOrientation em cada controlador para voltar NO não funciona:. Quando o iPhone é girado, o controlador é colocado no modo paisagem

Eu implementei shouldAutorotateToInterfaceOrientation da seguinte forma no UITabBarController subclasse:

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

    return NO;
}

Assim que somente as duas guias Estou interessado na verdade obter suporte para modo paisagem. Existe uma maneira para o modo paisagem suporte para um controlador específico na pilha de um guia particular?

Eu tentei, sem sucesso, algo como

(BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

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

     return NO;

}

Além disso, eu tentei usar o método delegado didSelectViewController, sem sucesso. Qualquer ajuda é muito apreciada. Obrigado.

Foi útil?

Solução

Isso funcionou para mim:

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

Outras dicas

Aqui está uma extensão para UITabBarController que delega chamadas para shouldAutorotateToInterfaceOrientation ao controlador criança atualmente selecionado. Usando esta extensão, você não precisa subclasse UITabBarController mais e você pode usar shouldAutorotateToInterfaceOrientation em seus controladores, como seria de esperar.

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

Eu tenho sido capaz de usar isso por um tempo agora (a partir de controlador de barra de abas do meu app) sem problemas:

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

Assim, no VC apropriado, nós começamos a fazer o real verificar, neste caso para uma visão galeria de fotos (o que mais?):

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

A minha galeria vista não é mesmo na pilha de top-of-para um determinado Nav Controller. Ele ainda é chamada.

Infelizmente, eu só descobri que este não trabalho tão bem quando o VC está à espreita dentro do MoreViewController (em oposição aos quatro abas principais). Nesse caso, minha galeria VC nunca é chamado. Eu acho que é porque o VC Estou ligando o tempo todo é realmente o controlador nav do guia selecionada, que então Propaga as coisas para a VC apropriado, neste caso minha galeria de fotos VC. Mas para o mais VC, as coisas não funcionam tão bem ... Aaaand as coisas vão rotacional descer de lá. : \

Eu tentei usar as modificações por Andreas (veja em outra parte deste segmento), sem sucesso. Pistas bem-vindos!

Eu corri para as mesmas questões que você fez quando se trabalha com o UITabBarController. I necessário para controlar quais UIViewControllers foram autorizados a rotação e que não eram. A principal problema foi com a guia Mais. Eu não queria que qualquer um dos UIViewControllers incluídos no guia mais para girar.

A minha solução foi criar meu próprio UITabBarController que chamei MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

Então eu implementei o 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

Eu precisava descobrir se a guia Mais foi selecionado. Este é um processo de dois passos; quando o separador é seleccionado MAIS inicialmente a API retorna um selectedIndex superior a 4 para necessário para comparar o controlador seleccionado com o moreNavigationController.

Se um UIViewController é selecionado a partir do guia Mais então o selectedIndex é, finalmente, 4 mas o selectedController não é o moreNavigationController mais, mas o UIViewController selecionado.

O if ((controlador == [auto moreNavigationController]) || ([auto selectedIndex] == 4)) cuida desta questão.

Agora, quando eu executar o meu aplicativo meus UIViewControllers na guia Mais não são rodados. Espero que este irá ajudar outros desenvolvedores que estão correndo para as mesmas questões que eu fiz.

Emilio

Pelo que tenho visto aqui e em outros lugares que tenho costuradas uma solução que utiliza o método shouldAutorotate desde a idade shouldAutorotateToInterfaceOrientation foi substituído.

Eu coloquei-o dentro de uma categoria para UITabBarController. eu assim espero que esta é admissível!

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

Obrigado, Obrigado, Obrigado. Este tem sido 2 dias em descobrir como fazer isso. Aqui é a minha opinião sobre todo o seu grande ajuda quando você tem um tabBarController com 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; 

}

Qualquer crítica do código de um codificador neophite é sempre apreciada ... jack

É realmente OK para subclasse UITabBarController (como sugerido na resposta aceita acima)?

Eu tenho entendido que Apples diz algo como "você nunca deve subclasse UITabBarController ou UINavigationController?" - ou ter eu entendi mal

De qualquer forma; Eu encontrei este tutorial onde eles subclasses um UIViewController em que eles colocaram um UITabBarController.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top