Aplicativo para iPhone no modo paisagem, sistemas 2008

98

Observe que esta pergunta é de 2008 e agora é de interesse apenas histórico.


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

Ambos programaticamente e usando o Interface Builder.

Michiel de Mare
fonte
5
Para futuros leitores, observe que este famoso problema foi RESOLVIDO pela Apple em 2011. Observe o projeto de teste na resposta abaixo.
Fattie

Respostas:

47

Resposta histórica apenas. Espetacularmente desatualizado.

Observe que esta resposta agora está extremamente desatualizada /

Essa resposta é apenas uma curiosidade histórica .


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

Pareceria que NÃO é mais necessário forçar o tamanho da vista em cada vista, e o sério problema específico da paisagem "apenas trabalhando na primeira vez" foi resolvido.

Em abril de 2011, não era possível testar ou mesmo construir nada 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. Isso é totalmente irrelevante agora, pois esses sistemas nem mesmo são operáveis.


É EXTREMAMENTE DIFÍCIL fazer esse trabalho totalmente - há pelo menos três problemas / bugs em jogo.

tente isso .. interface builder landscape design

Observe em particular que onde diz "e você precisa usar 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 UMA vista (toda paisagem), SIMPLESMENTE NÃO FUNCIONA . É fundamental se lembrar disso ou 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 torne a segunda visualização que você carrega, paisagem. A solução alternativa 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, inserir newThing.view, ISSO NÃO FUNCIONA - E ISSO É ISSO. A máquina nunca girará a vista para a paisagem. Não há conserto de truques, nem mesmo a Apple consegue fazer 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!

Fattie
fonte
2
Eu acredito que isso foi corrigido no 4.x. Enviamos um jogo que tinha várias telas diferentes, algumas paisagens e alguns retratos, e simplesmente não funcionava no 3.x. Não querendo entrar na visualização fictícia extra para lidar com isso, em vez disso, exigimos 4.x - o que, um ano depois que esta pergunta foi feita, provavelmente está OK.
AndrewS
Não fizemos "sempre paisagem", mas sim paisagens ou retratos variados. Cada VC é adicionado e removido diretamente da janela. O aplicativo é iniciado no modo paisagem e permanece assim durante várias transições de tela. Não usamos uma visão fictícia, mas substituímos o shouldAutorotate em todas as telas. Sem problemas no 4.x, do toque ao teclado ao telefone.
AndrewS
41

Do site Apple Dev:

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

Listagem 2: Iniciando seu aplicativo no modo paisagem

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Michael Pryor
fonte
5
Isso mais em seu retorno de métodos shouldAutorotateToInterfaceOrientation (interfaceOrientation! = UIInterfaceOrientationPortrait); e pronto.
Michael Behan
5
A questão pergunta como iniciar o dispositivo no modo paisagem. As respostas fornecem essa informação. A orientação de manuseio depois disso não é mencionada na pergunta. +1 Michael Pryor
ingh.am
1
Curiosamente, a "resposta" na verdade NÃO iniciará o dispositivo no modo paisagem - !! É provavelmente o bug / dificuldade mais famoso em todo o ambiente da Apple. É um desenvolvedor básico para iPad que trabalha muito!
Fattie
@mbehan Também existe UIInterfaceOrientationPortraitUpsideDown, portanto, não é uma correção. Além disso, UIInterfaceOrientation em .plist é compatível apenas com 3.2+, não em 3.1.3 e dispositivos mais antigos (e lembre-se de que o iPhone 2G está travado nessa versão).
Ivan Vučica,
28

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 UISupportedInterfaceOrientationsno Info.plistarquivo
  2. em sua janela defina um "controlador de visualização de base" 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 todas as visualizações, os controladores definem uma visualização de fundo com

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

    no viewDidLoadmé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 do aplicativo".

Referências:

IlDan
fonte
1
Posso confirmar que esta é a única solução verdadeiramente funcional (com um pequeno acréscimo). Levei horas para encontrar e avaliar isso. Todas as outras respostas são apenas soluções parciais para o problema.
Johannes Rudolph
8

Primeiro eu configuro em info.plist

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

então coloco 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 no modo paisagem.

samvermette
fonte
7

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 no modo paisagem , iPhone SDK: Como forçar apenas o modo Paisagem?

@Robert: consulte O iPhone SDK, NDA e Stack Overflow .

Sören Kuklau
fonte
6

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

Em todos os meus testes, ao dispensar um controlador de visualização modal, a orientação preferida do controlador de visualização pai definida shouldAutorotateToInterfaceOrientationé honrada mesmo quando faz parte de um UINavigationController. Portanto, 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 viewWillAppearfor chamado em seu controlador de visualização raiz, apenas apresente o controlador de visualização fictício sem animação.

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

Isso não só funciona, mas parece bom! BTW, apenas para esclarecimento, eu faço o controlador de visualização root viewWillAppearassim:

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

O guia de programação do iPhone OS mais recente 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...

  • definir as propriedades Info.plist (isso muda a posição da barra de status, mas não a visualização)
  • gire sua visualização manualmente em torno de seu centro, no método UIViewController viewDidLoad: ou no método applicationDidFinishLaunching: ou implemente a rotação automática ("Autoresizing behaviors", página 124)

Procure "Iniciando no Modo Paisagem", página 102.


fonte
4

Veja esta resposta: Modo paisagem SOMENTE para iPhone ou iPad

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
nicc
fonte