78 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
	
|     import UIKit
 | ||
|     import Flutter
 | ||
| 
 | ||
|     @main
 | ||
|     @objc class AppDelegate: FlutterAppDelegate {
 | ||
|       // 动态方向掩码(默认竖屏)
 | ||
|       static var orientationMask: UIInterfaceOrientationMask = .portrait
 | ||
| 
 | ||
|       override func application(
 | ||
|         _ application: UIApplication,
 | ||
|         didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
 | ||
|       ) -> Bool {
 | ||
| 
 | ||
|         let controller = window?.rootViewController as! FlutterViewController
 | ||
|         let channel = FlutterMethodChannel(name: "app.orientation",
 | ||
|                                            binaryMessenger: controller.binaryMessenger)
 | ||
| 
 | ||
|         channel.setMethodCallHandler { [weak self] call, result in
 | ||
|           guard let self = self else { return }
 | ||
| 
 | ||
|           if call.method == "setOrientation" {
 | ||
|             guard let arg = call.arguments as? String else {
 | ||
|               result(FlutterError(code: "BAD_ARGS", message: "need 'landscape' | 'portrait'", details: nil))
 | ||
|               return
 | ||
|             }
 | ||
| 
 | ||
|             // 先更新允许的方向掩码
 | ||
|             if arg == "landscape" {
 | ||
|               AppDelegate.orientationMask = .landscape
 | ||
|             } else if arg == "portrait" {
 | ||
|               AppDelegate.orientationMask = .portrait
 | ||
|             } else {
 | ||
|               result(FlutterError(code: "BAD_ARGS", message: "unknown arg", details: nil))
 | ||
|               return
 | ||
|             }
 | ||
| 
 | ||
|             
 | ||
|             // 再请求实际旋转
 | ||
|             if #available(iOS 16.0, *) {
 | ||
|                 // 通知顶层 VC:其 supportedInterfaceOrientations 需要刷新
 | ||
|                 self.window?.rootViewController?.setNeedsUpdateOfSupportedInterfaceOrientations()
 | ||
| 
 | ||
|               if let scene = self.window?.windowScene {
 | ||
|                 let orientations: UIInterfaceOrientationMask =
 | ||
|                   (arg == "landscape") ? .landscape : .portrait
 | ||
|                 do {
 | ||
|                   try scene.requestGeometryUpdate(.iOS(interfaceOrientations: orientations))
 | ||
|                 } catch {
 | ||
|                   result(FlutterError(code: "GEOMETRY_UPDATE_FAILED",
 | ||
|                                       message: error.localizedDescription, details: nil))
 | ||
|                   return
 | ||
|                 }
 | ||
|               }
 | ||
|             } else {
 | ||
|               let target: UIInterfaceOrientation =
 | ||
|                 (arg == "landscape") ? .landscapeLeft : .portrait
 | ||
|               UIDevice.current.setValue(target.rawValue, forKey: "orientation")
 | ||
|               UIViewController.attemptRotationToDeviceOrientation()
 | ||
|             }
 | ||
| 
 | ||
|             result(true)
 | ||
|           } else {
 | ||
|             result(FlutterMethodNotImplemented)
 | ||
|           }
 | ||
|         }
 | ||
| 
 | ||
|         GeneratedPluginRegistrant.register(with: self)
 | ||
|         return super.application(application, didFinishLaunchingWithOptions: launchOptions)
 | ||
|       }
 | ||
| 
 | ||
|       // 关键:把当前的掩码提供给系统
 | ||
|       override func application(_ application: UIApplication,
 | ||
|                                 supportedInterfaceOrientationsFor window: UIWindow?)
 | ||
|         -> UIInterfaceOrientationMask {
 | ||
|         return AppDelegate.orientationMask
 | ||
|       }
 | ||
|     }
 |