Pergunta

Observação:esta questão é de 2008 e agora tem apenas interesse histórico.


Qual é a melhor maneira de criar um aplicativo para iPhone que rode em modo paisagem desde o início, independentemente da posição do dispositivo?

Tanto programaticamente quanto usando o Interface Builder.

Foi útil?

Solução

Resposta histórica apenas.Espetacularmente desatualizado:

Observe que esta resposta agora está extremamente desatualizada.

Esta postagem é apenas uma curiosidade histórica.


Notícia emocionante!Conforme descoberto por Andrew abaixo, esse problema foi corrigido pela Apple na versão 4.0+.

Parece que NÃO é mais necessário forçar o tamanho da vista em todas as vistas, e o grave problema específico da paisagem "só funciona na primeira vez" foi resolvido.

Desde abril de 2011, não é possível testar ou mesmo construir algo abaixo de 4.0, então a questão é puramente uma curiosidade histórica.É incrível quantos problemas isso causou aos desenvolvedores por tanto tempo!


Aqui está a discussão e solução originais.Isto é totalmente irrelevante agora, uma vez que estes sistemas nem sequer são operáveis.


É EXTREMAMENTE DIFÍCIL fazer isso funcionar completamente - há pelo menos três problemas/bugs em jogo.

tente isso .. projeto paisagístico do construtor de interface

Observe em particular que onde diz "e você precisa usar o shouldAutorotateToInterfaceOrientation corretamente em todos os lugares" significa em todos os lugares, todas as suas visualizações em tela cheia.

Espero que ajude neste pesadelo!

Um lembrete importante do problema ADICIONAL bem conhecido em questão aqui:se você está tentando alternar entre MAIS DE UM vista (toda paisagem), SIMPLESMENTE NÃO FUNCIONA.É essencial lembrar disso ou você perderá dias com o problema.Literalmente NÃO É POSSÍVEL.É o maior bug aberto e conhecido na plataforma iOS.Literalmente, não há como fazer com que o hardware faça com que a segunda visualização que você carrega seja paisagem.A solução irritante, mas simples, e o que você deve fazer, é ter um UIViewController mestre trivial que não faz nada além de ficar parado e permitir que você alterne entre suas visualizações.

Em outras palavras, no iOS devido a um grande bug conhecido:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Você pode fazer isso apenas uma vez.Mais tarde, se você tentar remover happyThing.view e, em vez disso, colocar newThing.view lá, NÃO FUNCIONA - E É ISSO.A máquina nunca girará a visualização para paisagem.Não há solução complicada, nem mesmo a Apple consegue fazê-lo funcionar.A solução alternativa que você deve adotar é ter um UIViewController geral que simplesmente fique lá e mantenha suas várias visualizações (happyThing, newThing, etc).Espero que ajude!

Outras dicas

No site de desenvolvimento da Apple:

Para iniciar seu aplicativo no modo de paisagem, para que a barra de status esteja na posição apropriada imediatamente, edite seu arquivo info.plist para adicionar a chave do UiInterfaceRientation com o valor apropriado (UiInterfaceRientationlandsCoperright ou UiInterfaceRientationLandscapeleft), conforme mostrado na Listagem 2.

Listagem 2:Iniciando sua aplicação no modo paisagem

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

Resumo e integração de todos os posts, depois de testar eu mesmo;verifique a atualização para 4.x, 5.x abaixo.

A partir da versão 3.2 você não pode alterar a orientação de um aplicativo em execução a partir do código.

Mas você pode iniciar um aplicativo com uma orientação fixa, embora isso não seja simples.

Experimente com esta receita:

  1. defina sua orientação para UISupportedInterfaceOrientations no Info.plist arquivo
  2. na sua janela defina um "controlador de visualização base" de 480x320.Todas as outras visualizações serão adicionadas como uma subvisualização à sua visualização.
  3. em todos os controladores de visualização, configure o shouldAutorotateToInterfaceOrientation: método (para retornar o mesmo valor que você definiu no plist, é claro)
  4. em todos os controladores de visualização, defina uma visualização em segundo plano com

    self.view.frame = CGRectMake(0, 0, 480, 320)

    no viewDidLoad método.

Atualização (iOS 4.x, 5.x):o Guia de programação de aplicativos Apple iOS tem um parágrafo "Iniciando no modo paisagem" no capítulo "Truques avançados de aplicativos".

Referências:

Primeiro eu configurei em info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

então coloquei este código em applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

Dessa forma posso trabalhar na visualização no Interface Builder em modo paisagem.

A resposta de sasb e michaelpryor parece estar correta, mas se não estiver funcionando para você, tente esta alternativa:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Ou este:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Ou este:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Você também pode ter que ligar window makeKeyAndVisible; primeiro.

Alguns links: Desenvolvendo em modo paisagem, SDK do iPhone:Como forçar apenas o modo Paisagem?

@Roberto:por favor consulte O iPhone SDK, NDA e Stack Overflow.

Estou surpreso que ninguém tenha encontrado esta resposta ainda:

Em todos os meus testes, ao descartar um controlador de visualização modal, a orientação preferida do controlador de visualização pai foi definida em shouldAutorotateToInterfaceOrientation é honrado mesmo quando faz parte de um UINavigationController.Então a solução para isso é simples:

Crie um UIViewController fictício com um UIImageView como plano de fundo.Defina a imagem como a imagem default.png que seu aplicativo usa na inicialização.

Quando viewWillAppear é chamado em seu controlador de visualização raiz, basta apresentar o controlador de visualização fictício sem animação.

quando viewDidAppear for chamado em seu controlador de visualização fictício, dispense o controlador de visualização com uma bela animação de dissolução cruzada.

Isso não apenas funciona, mas parece bom!BTW, apenas para esclarecimento eu faço o controlador de visualização raiz viewWillAppear assim:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

O guia de programação mais recente do iPhone OS tem uma seção completa sobre isso, com código de exemplo.Tenho certeza de que esta é uma adição recente, então talvez você tenha perdido.Explica todas as condições que você deve cumprir;basicamente...

  • defina as propriedades do Info.plist (isso altera a posição da barra de status, mas não a visualização)
  • gire sua visualização manualmente em torno de seu centro, em seu UIViewController viewDidLoad:método ou seu aplicativoDidFinishLaunching:método ou implementar a rotação automática ("Comportamentos de redimensionamento automático", página 124)

Procure por "Iniciando no modo paisagem", página 102.

Veja esta resposta: Modo paisagem SOMENTE para iPhone ou iPad

  1. adicionar orientação ao plist
  2. deveriaAutorotateToInterfaceOrientation = YES em todos os arquivos

Embora se você estiver usando modos mistos, talvez seja melhor usar

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top