⚠️ 장치 방향! = 인터페이스 방향 ⚠️
Swift 5. * iOS14 이하
정말 다음과 같은 차이를 만들어야합니다.
- 장치 방향 => 물리적 장치의 방향을 나타냅니다.
- 인터페이스 방향 => 화면에 표시된 인터페이스의 방향을 나타냅니다.
다음과 같이 두 값이 일치하지 않는 많은 시나리오가 있습니다.
대부분의 경우 인터페이스 방향을 사용하고 싶고 창을 통해 가져올 수 있습니다.
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
<iOS 13 (예 : iOS 12)도 지원하려면 다음을 수행합니다.
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
이제 창 인터페이스 방향 변경에 반응 할 위치를 정의해야합니다. 이를 수행하는 방법에는 여러 가지가 있지만 최적의 솔루션은 내에서 수행하는 것입니다
willTransition(to newCollection: UITraitCollection
.
재정의 될 수있는이 상속 된 UIViewController 메서드는 인터페이스 방향이 변경 될 때마다 트리거됩니다. 결과적으로 후자에서 모든 수정을 수행 할 수 있습니다.
다음은 솔루션 예입니다.
class ViewController: UIViewController {
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
if windowInterfaceOrientation.isLandscape {
} else {
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
이 메서드를 구현하면 인터페이스 방향 변경에 반응 할 수 있습니다. 그러나 앱을 열 때 트리거되지 않으므로에서 인터페이스를 수동으로 업데이트해야합니다 viewWillAppear()
.
장치 방향과 인터페이스 방향의 차이를 강조하는 샘플 프로젝트를 만들었습니다. 또한 UI를 업데이트하기로 결정한 수명주기 단계에 따라 다른 동작을 이해하는 데 도움이됩니다.
다음 저장소를 자유롭게 복제하고 실행하십시오 :
https://github.com/wjosset/ReactToOrientation