Tenho um aplicativo em que gostaria de oferecer suporte à rotação do dispositivo em certas visualizações, mas outras não fazem muito sentido no modo Paisagem, então, ao trocar as visualizações, gostaria de forçar a rotação a ser definida como retrato.
Há um setter de propriedade não documentado em UIDevice que faz o truque, mas obviamente gera um aviso do compilador e pode desaparecer com uma revisão futura do SDK.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
Existem maneiras documentadas de forçar a orientação?
Atualização: pensei em fornecer um exemplo, pois não estou procurando shouldAutorotateToInterfaceOrientation, pois já o implementei.
Quero que meu aplicativo suporte paisagem e retrato na Visualização 1, mas apenas retrato na Visualização 2. Já implementei shouldAutorotateToInterfaceOrientation para todas as visualizações, mas se o usuário estiver no modo paisagem na Visualização 1 e, em seguida, alternar para Visualização 2, quero forçar o telefone para girar de volta para Retrato.
fonte
Respostas:
Isso não é mais um problema no SDK do iPhone 3.1.2 posterior. Agora parece respeitar a orientação solicitada da visualização sendo empurrada de volta para a pilha. Isso provavelmente significa que você precisaria detectar versões mais antigas do iPhone OS e aplicar setOrientation apenas quando for anterior à versão mais recente.
Não está claro se a análise estática da Apple compreenderá que você está contornando as limitações do SDK mais antigo. A Apple me disse pessoalmente para remover a chamada do método na minha próxima atualização, então ainda não tenho certeza se um hack para dispositivos mais antigos passará pelo processo de aprovação.
fonte
Isso é muito depois do fato, mas apenas no caso de aparecer alguém que não esteja usando um controlador de navegação e / ou não queira usar métodos não documentados:
É suficiente apresentar e descartar um controlador de visualização vanilla.
Obviamente, você ainda precisará confirmar ou negar a orientação em sua substituição de shouldAutorotateToInterfaceOrientation. Mas isso fará com que o shouldAutorotate ... seja chamado novamente pelo sistema.
fonte
Se você quiser forçá-lo a girar de retrato para paisagem, aqui está o código. Apenas observe que você precisa ajustar o centro de sua visão. Percebi que o meu não colocava a vista no lugar certo. Caso contrário, funcionou perfeitamente. Obrigado pela dica.
fonte
CGAffineTransformMakeRotation
girar a vista, mas o UIAlertView ainda está de acordo com a orientação da barra de status, ou seja, -degreeToRadian (ângulo)? Você conseguiu algo assim?UIAlertView
é definir seu controlador de visualização como o delegado do alertView e, em seguida, em:,- (void) didPresentAlertView:(UIAlertView *) alertView
você executa a rotação com base na corrente[UIApplication sharedApplication].statusBarOrientation
. Se você não animar, não deve parecer muito estranho.Pelo que posso dizer, o
setOrientation:
método não funciona (ou talvez não funcione mais). Aqui está o que estou fazendo para fazer isso:primeiro, coloque esta definição no topo do seu arquivo, logo abaixo do seu #imports:
então, no
viewWillAppear:
métodose você quiser que seja animado, pode embrulhar tudo em um bloco de animação, assim:
Então, em seu controlador de modo retrato, você pode fazer o inverso - verifique se ele está atualmente em paisagem e, se estiver, gire-o de volta para Retrato.
fonte
Eu estava tendo um problema em que tinha um
UIViewController
na tela, em umUINavigationController
, na orientação paisagem. Quando o próximo controlador de visualização é colocado no fluxo, no entanto, eu preciso que o dispositivo volte para a orientação retrato.O que percebi é que o
shouldAutorotateToInterfaceOrientation:
método não é chamado quando um novo controlador de visualização é colocado na pilha, mas é chamado quando um controlador de visualização é retirado da pilha .Aproveitando isso, estou usando este snippet de código em um de meus aplicativos:
Basicamente, criando um controlador de visualização vazio, colocando-o na pilha e imediatamente retirando-o, é possível fazer com que a interface volte para a posição retrato. Uma vez que o controlador foi acionado, eu simplesmente pressiono o controlador que pretendia inserir em primeiro lugar. Visualmente, parece ótimo - o controlador de visualização vazio e arbitrário nunca é visto pelo usuário.
fonte
Há uma maneira simples de forçar programaticamente o iPhone para a orientação necessária - usando duas das respostas já fornecidas por kdbdallas , Josh :
Funciona como um encanto :)
EDITAR:
para iOS 6, preciso adicionar esta função: (funciona no viewcontroller modal)
fonte
Tenho cavado e cavado procurando uma boa solução para isso. Encontrei esta postagem de blog que resolve o problema: remova sua visão externa da chave
UIWindow
e adicione-a novamente, o sistema irá então consultar novamente osshouldAutorotateToInterfaceOrientation:
métodos de seus controladores de visão, reforçando a orientação correta a ser aplicada. Veja: iphone forçando uiview a reorientarfonte
A resposta de Josh funciona bem para mim.
No entanto, prefiro postar uma notificação "a orientação mudou, atualize a IU" . Quando esta notificação é recebida por um controlador de visualização, ele chama
shouldAutorotateToInterfaceOrientation:
, permitindo que você defina qualquer orientação retornandoYES
para a orientação desejada.O único problema é que isso força uma reorientação sem animação. Você precisaria quebrar essa linha entre
beginAnimations:
ecommitAnimations
para obter uma transição suave.Espero que ajude.
fonte
FWIW, aqui está minha implementação de definir manualmente a orientação (para ir no controlador de visualização raiz do seu aplicativo, natch):
juntamente com o seguinte
UINavigationControllerDelegate
método (supondo que você esteja usando umUINavigationController
):Isso se encarrega de girar a vista raiz de acordo com se uma entrada
UIViewController
suporta a orientação atual do dispositivo. Finalmente, você vai querer se conectarrotateInterfaceToOrientation
às mudanças reais de orientação do dispositivo para imitar a funcionalidade padrão do iOS. Adicione este manipulador de eventos ao mesmo controlador de visualização raiz:Por fim, registre-se para
UIDeviceOrientationDidChangeNotification
receber notificações eminit
ouloadview
assim:fonte
shouldAutorotate
método (consulte stackoverflow.com/a/12586002/5171 ).Isso funciona para mim (obrigado Henry Cooke):
O objetivo para mim era lidar apenas com as mudanças de orientação da paisagem.
método init:
fonte
Percebo que a postagem original acima neste tópico é muito antiga agora, mas eu tive um problema semelhante a ela - isto é. todas as telas em meu aplicativo são apenas retrato, com exceção de uma tela, que pode ser girada entre paisagem e retrato pelo usuário.
Isso foi bastante direto, mas como em outras postagens, eu queria que o aplicativo retornasse automaticamente ao modo retrato, independentemente da orientação atual do dispositivo, ao retornar à tela anterior.
A solução que implementei foi ocultar a Barra de Navegação no modo paisagem, o que significa que o usuário só pode retornar às telas anteriores enquanto estiver no retrato. Portanto, todas as outras telas só podem estar em retrato.
Isso também tem o benefício adicional para meu aplicativo, pois há mais espaço de tela disponível no modo paisagem. Isso é útil porque a tela em questão é usada para exibir arquivos PDF.
Espero que isto ajude.
fonte
Resolvi isso com bastante facilidade no final. Tentei todas as sugestões acima e ainda não consegui, então esta foi minha solução:
No ViewController que precisa permanecer como Paisagem (Esquerda ou Direita), eu escuto as mudanças de orientação:
Então, em didRotate:
Lembre-se de quaisquer Super Views / Subviews que usam o redimensionamento automático, já que view.bounds / frame estão sendo redefinidos explicitamente ...
A única ressalva a este método para manter a vista Paisagem, é a animação inerente alternando entre as orientações que deve ocorrer, quando seria melhor que parecesse não ter alteração.
fonte
Solução iOS 6:
O código exato depende do aplicativo e também de onde você o coloca (eu usei no meu AppDelegate). Substitua
[[self window] rootViewController]
pelo que você usa. Eu estava usando umUITabBarController
.fonte
Eu encontrei uma solução e escrevi algo em francês (mas o código está em inglês). aqui
A maneira é adicionar o controlador à visualização da janela (o controlador deve possuir uma boa implementação da função shouldRotate ....).
fonte
Se você estiver usando UIViewControllers, existe este método:
Retorne
NO
para os controladores de visualização contendo as visualizações que você não deseja girar.Mais informações aqui
fonte
Eu não acho que isso seja possível fazer em tempo de execução, embora você possa, é claro, apenas aplicar uma transformação de 90 graus à sua IU.
fonte
É isso que eu uso. (Você recebe alguns avisos de compilação, mas funciona tanto no Simulador quanto no iPhone)
fonte