iOS에서 각 회전 감지 방법과 그 결과

2976 단어 iOSSwiftiPad아이폰
iOS에서 회전 검지 방법이 복수 있어, 용도에 따라서는 방향이 좋지 않기 때문에, 회전 검지 방법과 검지 타이밍마다의 결과를 정리해 보았습니다.

검증시 환경



개발 환경: Xcode9beta
iOS 버전: 11beta
언어: Swift4

단말의 종횡 상태 취득



단말의 종횡 상태는 이하의 2 종류로 취득했습니다.

UIInterfaceOrientation
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation))
let isLandscape = UIInterfaceOrientationIsLandscape(UIApplication.shared.statusBarOrientation))

UIDeviceOrientation
let isPortrait = UIDeviceOrientationIsPortrait(UIDevice.current.orientation))
let isLandscape = UIDeviceOrientationIsLandscape(UIDevice.current.orientation))

회전 감지 방법



viewDidLoad




앱 시작 직후를 상정한 결과입니다.
- UIInterfaceOrientation과의 조합만 감지는 정확

NSNotification


override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(MainViewController.onOrientationDidChange(notification:)), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}

@objc
func onOrientationDidChange(notification: NSNotification) {
    // ここに回転時の処理
}


- 감지는 정확
- 앱 시작 직후 처리
- 백그라운드 마이그레이션 후 두 번 처리됨
- ViewController가 겹친 상태에서도 감지됨

viewWillLayoutSubviews




- 감지는 정확
- ViewController가 겹친 상태에서는 감지되지 않음

viewDidLayoutSubviews


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // ここに回転時の処理
}


- 감지는 정확
- ViewController가 겹친 상태에서는 감지되지 않음

viewWillTransition


override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
    // ここに回転時の処理
}


- UIDeviceOrientation과의 조합만 감지는 정확
- 회전 시에만 처리됨
- ViewController가 겹친 상태에서 감지됨

약속


  • ViewController가 겹치는 상태에서의 검출 결과를 추가 예정
  • CollectionView의 각 처리 타이밍과 회전 검출 타이밍을 추가 예정
  • 좋은 웹페이지 즐겨찾기