iOS 16 orientation change

2023. 1. 27. 11:55iOS/이슈

iOS 16 들어와서 AVasset 관련도 그렇고 추상화, 비동기가 강조된 느낌이다.

프로젝트 설정은 Portrait Only로 설정되어 있음

 

// AppDelegate에서 orientation 값을 바꿔줘야한다.
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?
	) -> UIInterfaceOrientationMask {
	return myOrientation
}

// Landscape ViewController

// 지원할 오리엔테이션 모드
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .allButUpsideDown
  }

func rotate(orientation: UIInterfaceOrientationMask) {
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    appDelegate?.myOrientation = orientation
    
    if #available(iOS 16.0, *) {
      self.setNeedsUpdateOfSupportedInterfaceOrientations()
      self.view.layoutIfNeeded()
      return
    }
    
    if orientation == .portrait {
      let value = UIInterfaceOrientation.portrait.rawValue
      UIDevice.current.setValue(value, forKey: "orientation")
    } else if orientation == .landscapeRight {
      let value = UIInterfaceOrientation.landscapeRight.rawValue
      UIDevice.current.setValue(value, forKey: "orientation")
    } else if orientation == .landscapeLeft {
      let value = UIInterfaceOrientation.landscapeLeft.rawValue
      UIDevice.current.setValue(value, forKey: "orientation")
    }
}

남은 이슈

제스처 이벤트를 통한 rotate()는 되는데 

UIDevice.orientationDidChangeNotification을 이용한 rotate()는 바로 동작을 안하고 UI가 새로 그려질 때(statusBar를 내리거나, foreground로 돌아올 때)만 동작한다.

메인 쓰레드에서 동작하는데 의문임

 

출처

 

Force landscape mode in one ViewController using Swift

I am trying to force only one view in my application on landscape mode, I am calling: override func shouldAutorotate() -> Bool { print("shouldAutorotate") return false } overr...

stackoverflow.com