Pois meu aplicativo tem suporte para todas as orientações. Eu gostaria de bloquear apenas o modo retrato para UIViewController específico.
por exemplo, suponha que foi um aplicativo com guias e quando o SignIn View aparecer modalmente, eu só quero que o SignIn View no modo retrato não importa como o usuário gire o dispositivo ou como a orientação atual do dispositivo será
swift
uiviewcontroller
portrait
device-orientation
Thiha Aung
fonte
fonte
Respostas:
As coisas podem ficar um pouco confusas quando você tem uma hierarquia de visualização complicada, como ter vários controladores de navegação e / ou controladores de visualização de guia.
Essa implementação permite que os controladores de visualização individuais definam quando desejam bloquear as orientações, em vez de depender do App Delegate para localizá-las iterando por meio de subvisualizações.
Swift 3, 4, 5
Em AppDelegate:
Em alguma outra estrutura global ou classe auxiliar, criei aqui AppUtility:
Então, no ViewController desejado, você deseja bloquear as orientações:
Se for iPad ou aplicativo universal
Certifique-se de que "Requer tela inteira" esteja marcado em Configurações de destino -> Geral -> Informações de implantação.
supportedInterfaceOrientationsFor
delegado não será chamado se não estiver marcado.fonte
Requires full screen
, isso impedirá que o aplicativo fique disponível para Slide Over e Split View. Consulte Adotando aprimoramentos de multitarefa no iPad da Apple. Tenho uma resposta que não requer ativaçãoRequires full screen
Swift 4
AppDelegate
Seu ViewController Adicione a linha seguinte se você precisar apenas da orientação retrato. você tem que aplicar isso a todas as necessidades do ViewController para exibir o modo retrato.
e isso fará a orientação da tela para outros Viewcontroller de acordo com a orientação física do dispositivo.
fonte
func application
dentro do delegado do aplicativo por esta funçãofunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
Swift 3 e 4
Defina a
supportedInterfaceOrientations
propriedade de UIViewControllers específicos como este:ATUALIZAR
Esta solução só funciona quando seu não
viewController
está incorporado , porque a orientação é herdada do viewController pai. Nesse caso, você pode criar uma subclasse de e definir essas propriedades nela.UINavigationController
UINavigationViewController
fonte
Adicione este código para forçar o retrato e bloqueá-lo:
Em seu AppDelegate - defina supportedInterfaceOrientationsForWindow para quaisquer orientações que você deseja que todo o aplicativo suporte:
fonte
Esta é uma solução genérica para o seu problema e outros relacionados.
1. Crie a classe auxiliar UIHelper e use os seguintes métodos:
2. Crie um Protocolo com o seu comportamento desejado, pois seu caso específico será retrato.
orientação do protocoloIsOnlyPortrait {}
Nota: Se desejar, adicione-o no início da classe UIHelper.
3. Estenda seu controlador de visualização
No seu caso:
4. Na classe de delegado do aplicativo, adicione este método:
Notas Finais:
fonte
Um monte de ótimas respostas neste tópico, mas nenhuma correspondeu às minhas necessidades. Eu tenho um aplicativo com guias com controladores de navegação em cada guia e uma visualização precisa ser girada, enquanto as outras precisam ser travadas no modo retrato. O controlador de navegação não estava redimensionando suas subvisualizações corretamente, por algum motivo. Encontrou uma solução (no Swift 3) combinando com esta resposta, e os problemas de layout desapareceram. Crie a estrutura conforme sugerido por @bmjohns:
Em seguida, subclasse UITabBarController:
Não se esqueça de alterar a classe do TabBarController no storyboard para a subclasse recém-criada.
fonte
Para uma nova versão do Swift, experimente isto
fonte
Esta é uma maneira simples que funciona para mim com o Swift 4.2 (iOS 12.2), coloque em um
UIViewController
para o qual deseja desativar o shouldAutorotate:A
.portrait
parte informa em qual orientação permanecer, você pode alterar isso como quiser. As opções são:.portrait
,.all
,.allButUpsideDown
,.landscape
,.landscapeLeft
,.landscapeRight
,.portraitUpsideDown
.fonte
Para definir a orientação Paisagem para todas as visualizações do seu aplicativo e permitir apenas uma visualização para Todas as orientações (para poder adicionar o rolo da câmera, por exemplo):
Em AppDelegate.swift:
In: didFinishLaunchingWithOptions
Em outro lugar em AppDelegate.swift:
Então, na visualização que segue para aquela que você deseja, poderá ter Todas as orientações:
A última coisa é marcar a orientação do dispositivo: - Retrato - Paisagem à esquerda - Paisagem à direita
fonte
Crie uma nova extensão com
fonte
bmjohns -> Você é meu salvador de vida. Essa é a única solução de trabalho (com a estrutura AppUtility)
Eu criei esta classe:
e seguiu suas instruções, e tudo funciona perfeitamente para Swift 3 -> xcode versão 8.2.1
fonte
A partir do iOS 10 e 11, o iPad suporta Slide Over e Split View. Para habilitar um aplicativo em Slide Over e Split View,
Requires full screen
deve estar desmarcado. Isso significa que a resposta aceita não pode ser usada se o aplicativo quiser suportar Slide Over e Split View. Veja mais de Adoção de melhorias multitarefa no iPad da Apple aqui .Eu tenho uma solução que permite (1) desmarcar
Requires full screen
, (2) apenas uma função a ser implementadaappDelegate
(especialmente se você não quiser / não pode modificar os controladores de exibição de destino) e (3) evitar chamadas recursivas. Não há necessidade de classes auxiliares nem extensões.appDelegate.swift (Swift 4)
Editar
@bmjohns apontou que esta função não é chamada no iPad. Verifiquei e sim não foi chamado. Então, fiz mais alguns testes e descobri alguns fatos:
Requires full screen
porque desejo habilitar Slide Over e Slide View no iPad. Que requer o aplicativo para suportar todos os 4 orientação para iPad, em Info.plist:Supported interface orientations (iPad)
.Meu aplicativo funciona da mesma maneira que o Facebook: no iPhone, na maioria das vezes ele está bloqueado para retrato. Ao visualizar a imagem em tela cheia, permite aos usuários girar a paisagem para uma melhor visualização. No iPad, os usuários podem girar para qualquer orientação em qualquer controlador de visualização. Portanto, o aplicativo fica bem quando o iPad está na Smart Cover (paisagem à esquerda).
Para que o iPad faça a chamada
application(_:supportedInterfaceOrientationsFor)
, em Info.plist, mantenha apenas o retrato para o iPad. O aplicativo perderá a capacidade de Slide Over + Split View. Mas você pode bloquear ou desbloquear a orientação para qualquer controlador de visualização, em apenas um lugar e sem necessidade de modificar a classe ViewController.Finalmente, esta função é chamada no ciclo de vida do controlador de visualização, quando a visualização é exibida / removida. Se seu aplicativo precisar bloquear / desbloquear / alterar a orientação em outro momento, pode não funcionar
fonte
Solução real testada para isso . No meu exemplo, preciso que todo o meu aplicativo esteja no modo retrato, mas apenas a orientação de uma tela deve estar no modo paisagem.
Codifique em AppDelegate conforme as respostas acima descritas.
Em seguida, anote este código antes que seu viewcontroller de orientação horizontal seja apresentado / push.
Em seguida, escreva este código no viewcontroller real (para visualização em paisagem)
fonte
Experimentei um pouco e consegui encontrar uma solução limpa para este problema. A abordagem é baseada na marcação da visualização via view-> tag
No ViewController de destino, apenas atribua a tag à visualização raiz como no exemplo de código a seguir:
E, finalmente, no AppDelegate.swift, verifique se a visualização exibida atualmente é a que marcamos:
Essa abordagem foi testada com meu simulador e parece que funciona bem.
Nota: a visualização marcada também será encontrada se o MVC atual for sobreposto a algum ViewController filho na pilha de navegação.
fonte
Obrigado à resposta de @bmjohn acima. Aqui está uma versão Xamarin / C # funcional do código dessa resposta, para economizar o tempo da transcrição de outros:
AppDelegate.cs
Classe Static OrientationUtility.cs:
Ver controlador:
fonte
Melhor solução para bloquear e alterar a orientação em retrato e paisagem:
Veja este vídeo no YouTube:
https://m.youtube.com/watch?v=4vRrHdBowyo
Este tutorial é melhor e simples.
ou use o código abaixo:
Veja esta foto
// 1- no segundo viewcontroller definimos landscapeleft e no primeiro viewcontroller definimos portrat:
// 2- se você usar NavigationController, você deve adicionar a extensão
fonte