78 lines
2.7 KiB
Swift
78 lines
2.7 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
|
||
}
|
||
}
|