Alguém pode me dizer a abordagem "certa" ou "melhor" para trabalhar com orientações de interface em retrato e paisagem no iOS 8? Parece que todas as funções que desejo usar para esse fim estão obsoletas no iOS 8, e minha pesquisa não encontrou nenhuma alternativa clara e elegante. Devo realmente observar a largura e a altura para determinar por mim mesmo se estamos no modo retrato ou paisagem?
Por exemplo, no meu controlador de visualização, como devo implementar o seguinte pseudocódigo?
if we are rotating from portrait to landscape then
do portrait things
else if we are rotating from landscape to portrait then
do landscape things
UIViewController
. Veja a seção intitulada "Manipulando Rotações de Visualização". Ela explica o que você deve fazer.Respostas:
A Apple recomenda o uso de classes de tamanho como uma medida aproximada de quanto espaço de tela está disponível, para que sua IU possa alterar significativamente seu layout e aparência. Considere que um iPad em retrato tem as mesmas classes de tamanho que em paisagem (largura regular, altura regular). Isso significa que sua IU deve ser mais ou menos semelhante entre as duas orientações.
No entanto, a mudança de retrato para paisagem em um iPad é significativa o suficiente para que você precise fazer alguns ajustes menores na IU, mesmo que as classes de tamanho não tenham mudado. Como os métodos relacionados à orientação da interface em
UIViewController
foram descontinuados, a Apple agora recomenda a implementação do novo método a seguir emUIViewController
como um substituto:Ótimo! Agora você está recebendo retornos de chamada antes do início da rotação e depois que termina. Mas que tal saber realmente se a rotação é para retrato ou para paisagem?
A Apple recomenda pensar na rotação simplesmente como uma mudança no tamanho da visão dos pais. Em outras palavras, durante a rotação do iPad de retrato para paisagem, você pode pensar nisso como a visualização no nível da raiz simplesmente mudando
bounds.size
de{768, 1024}
para{1024, 768}
. Sabendo isto, em seguida, você deve usar osize
passado para oviewWillTransitionToSize:withTransitionCoordinator:
método acima para descobrir se você está girando para retrato ou paisagem.Se você deseja uma maneira ainda mais perfeita de migrar o código legado para a nova forma de fazer as coisas do iOS 8, considere usar esta categoria simples no UIView, que pode ser usada para determinar se uma visualização é "retrato" ou "paisagem" com base em seu Tamanho.
Para recapitular:
viewWillTransitionToSize:withTransitionCoordinator:
retorno de chamada em UIViewController.statusBarOrientation
- que é basicamente uma propriedade no nível do dispositivo - para determinar se deve fazer o layout de uma visualização para "retrato" ou "paisagem". A orientação da barra de status só deve ser usada por código que lida com coisas como asUIWindow
que realmente vivem no nível da raiz do aplicativo.fonte
UIViewControllerTransitionCoordinator
é um pesadelo :-(viewdidlayoutsubviews
? Achei queviewdidlayoutsubviews
é usado para capturar mudanças de limite devido à rotação. Você pode elaborar sobre isso?Com base na resposta muito bem detalhada (e aceita) do smileyborg, aqui está uma adaptação usando o swift 3:
E na
UICollectionViewDelegateFlowLayout
implementação,fonte
Eu simplesmente uso a Central de notificações:
Adicione uma variável de orientação (explicarei no final)
Adicionar notificação quando a visualização for exibida
Remover notificação quando a visualização for embora
Obtém a orientação atual quando a notificação é acionada
Verifica a orientação (retrato / paisagem) e lida com eventos
A razão pela qual adiciono uma variável de orientação é porque, ao testar em um dispositivo físico, a notificação de orientação é chamada a cada pequeno movimento no dispositivo, e não apenas quando ele gira. Adicionar as instruções var e if apenas chama o código se ele mudou para a orientação oposta.
fonte
super
deviewDidAppear
eviewWillDisappear
deve ser chamadoDo ponto de vista da IU, acredito que o uso de classes de tamanho é a abordagem recomendada da Apple para lidar com interfaces em diferentes orientações, tamanhos e escalas.
Consulte a seção: Traços Descrevem a Classe de Tamanho e Escala de uma Interface aqui: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Este também é um bom artigo: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
EDITAR Link atualizado: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Crédito: Koen)
fonte