カテゴリー
iOS Swift

ViewControllerごとにOrientationを指定したい

iOS15 参考

iOS16以降 参考

Helper

class Helper {
  static func forceRotate(orientation: UIInterfaceOrientationMask) {
    (UIApplication.shared.delegate as? AppDelegate)?.orientation = orientation
  let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene

  windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: orientation))

UIApplication.navigationTopViewController()?.setNeedsUpdateOfSupportedInterfaceOrientations()
  }
}

extension UIApplication {
  class func navigationTopViewController() -> UIViewController? {
    let nav = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
    return nav?.topViewController
  }
}

appDelegate

var orientation: UIInterfaceOrientationMask = .portrait
  
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return orientation
}

viewDidLoad()

override func viewDidLoad() {
  super.viewDidLoad()

  Helper.forceRotate(orientation: .portrait)
}