Quero adicionar duas imagens para visualização de imagem única (ou seja, para paisagem uma imagem e para retrato outra imagem), mas não sei como detectar mudanças de orientação usando linguagens rápidas.
Eu tentei esta resposta, mas leva apenas uma imagem
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("Landscape")
} else {
print("Portrait")
}
}
Eu sou novo no desenvolvimento de iOS, qualquer conselho seria muito apreciado!
Respostas:
fonte
viewWillTransition
ao criar subclassesUIView
?.isFlat
. Se você deseja apenas pegarportrait
, sugiro que altere a cláusula else paraelse if UIDevice.current.orientation.isPortrait
. Observação:.isFlat
pode acontecer em ambos, retrato e paisagem, e apenas com o else {} será o padrão sempre (mesmo se for paisagem plana).Usando NotificationCenter e UIDevice 's
beginGeneratingDeviceOrientationNotifications
Swift 4.2+
Swift 3
fonte
viewWillTransition:
antecipa que a mudança acontecerá enquanto usingUIDeviceOrientationDidChange
é chamado assim que a mudança for concluída.shouldAutorotate
estiver definido comofalse
. Isso é útil para telas como a tela principal do aplicativo Câmera - a orientação é bloqueada, mas os botões podem girar.Código do Swift 3 acima atualizado:
fonte
⚠️Device Orientation! = Interface Orientation⚠️
Swift 5. * iOS13 e inferior
Você realmente deve fazer a diferença entre:
Existem muitos cenários em que esses 2 valores são incompatíveis, como:
Na maioria dos casos, você deseja usar a orientação da interface e pode obtê-la por meio da janela:
Caso você também queira oferecer suporte ao <iOS 13 (como o iOS 12), faça o seguinte:
Agora você precisa definir onde reagir à mudança de orientação da interface da janela. Existem várias maneiras de fazer isso, mas a solução ideal é fazê-lo internamente
willTransition(to newCollection: UITraitCollection
.Este método UIViewController herdado, que pode ser sobrescrito, será acionado toda vez que a orientação da interface for alterada. Consequentemente, você pode fazer todas as modificações no último.
Aqui está um exemplo de solução :
Ao implementar este método, você será capaz de reagir a qualquer mudança de orientação de sua interface. Mas lembre-se de que ele não será acionado na abertura do aplicativo, então você também terá que atualizar manualmente sua interface no
viewWillAppear()
.Criei um projeto de amostra que destaca a diferença entre a orientação do dispositivo e a orientação da interface. Além disso, ajudará você a entender o comportamento diferente, dependendo de qual etapa do ciclo de vida você decide atualizar sua IU.
Sinta-se à vontade para clonar e executar o seguinte repositório: https://github.com/wjosset/ReactToOrientation
fonte
func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
não funcionou. Eu fiz funcionar usandofunc viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
.Swift 4+: Eu estava usando isso para design de teclado virtual e, por algum motivo, o
UIDevice.current.orientation.isLandscape
método continuava me dizendo que eraPortrait
, então aqui está o que usei:fonte
size
parâmetro que é injetado em viewWillTransitionToSize: withCoordinator: método que você escreveu acima. Isso refletirá o tamanho exato que sua visualização terá após a transição.Swift 4.2, RxSwift
Se precisarmos recarregar collectionView.
Swift 4, RxSwift
Se precisarmos recarregar collectionView.
fonte
Se você estiver usando a versão Swift> = 3.0, existem algumas atualizações de código que você deve aplicar como outros já disseram. Só não se esqueça de ligar para super:
Se você está pensando em usar um StackView para suas imagens, saiba que pode fazer algo como o seguinte:
Se você estiver usando o Interface Builder, não se esqueça de selecionar a classe personalizada para este objeto UIStackView, na seção Identity Inspector no painel direito. Em seguida, basta criar (também por meio do Interface Builder) a referência IBOutlet para a instância UIStackView personalizada:
Pegue a ideia e adapte-a às suas necessidades. Espero que isso possa ajudá-lo!
fonte
Swift 4
Tive alguns problemas menores ao atualizar a visualização ViewControllers usando
UIDevice.current.orientation
, como a atualização de restrições de células tableview durante a rotação ou animação de subvisualizações.Em vez dos métodos acima, estou atualmente comparando o tamanho da transição ao tamanho da visualização dos controladores de visualização. Este parece ser o caminho certo a seguir, já que temos acesso a ambos neste ponto do código:
Saída em um iPhone 6:
fonte
Acredito que a resposta correta seja, na verdade, uma combinação das duas abordagens:
viewWIllTransition(toSize:)
eNotificationCenter
'sUIDeviceOrientationDidChange
.viewWillTransition(toSize:)
notifica você antes da transição.NotificationCenter
UIDeviceOrientationDidChange
notifica você depois .Você tem que ser muito cuidadoso. Por exemplo, em
UISplitViewController
quando da rotação do dispositivo em determinadas linhas de orientação, aDetailViewController
fica retirado daUISplitViewController
'sviewcontrollers
matriz, e empurrado para o mestre deUINavigationController
. Se você procurar o controlador de visualização de detalhes antes de terminar a rotação, ele pode não existir e travar.fonte
Todas as contribuições anteriores estão bem, mas uma pequena observação:
a) se a orientação for definida no plist, apenas retrato ou exemplo, você será não notificado por viewWillTransition
b) se precisarmos saber se o usuário girou o dispositivo (por exemplo, um jogo ou similar), só podemos usar:
testado em Xcode8, iOS11
fonte
Para obter a orientação correta ao iniciar o aplicativo, você deve fazer o check-in
viewDidLayoutSubviews()
. Outros métodos descritos aqui não funcionarão.Aqui está um exemplo de como fazer isso:
Isso funcionará sempre, na primeira inicialização do aplicativo e se girar enquanto o aplicativo está em execução .
fonte
Você pode usar
viewWillTransition(to:with:)
e tocar emanimate(alongsideTransition:completion:)
para obter a orientação da interface APÓS a transição ser concluída. Você apenas precisa definir e implementar um protocolo semelhante a este para acessar o evento. Observe que este código foi usado para um jogo SpriteKit e sua implementação específica pode ser diferente.Você pode definir pontos de interrupção nessas funções e observar que
interfaceOrientationChanged(to orientation: UIInterfaceOrientation)
sempre é chamado depoisviewWillTransition(to size: CGSize)
com a orientação atualizada.fonte
Outra forma de detectar as orientações do dispositivo é com a função traitCollectionDidChange (_ :). O sistema chama esse método quando o ambiente de interface do iOS muda.
Além disso, você pode usar a função willTransition (to: with :) (que é chamada antes de traitCollectionDidChange (_ :)), para obter informações antes de a orientação ser aplicada.
fonte