2025-07-03 09:45:15 +08:00
|
|
|
|
import UIKit
|
2025-08-21 10:53:10 +08:00
|
|
|
|
import Flutter
|
2025-07-03 09:45:15 +08:00
|
|
|
|
|
|
|
|
|
@main
|
|
|
|
|
@objc class AppDelegate: FlutterAppDelegate {
|
2025-08-21 10:53:10 +08:00
|
|
|
|
// 动态方向掩码(默认竖屏)
|
|
|
|
|
static var orientationMask: UIInterfaceOrientationMask = .portrait
|
|
|
|
|
|
2025-07-03 09:45:15 +08:00
|
|
|
|
override func application(
|
|
|
|
|
_ application: UIApplication,
|
|
|
|
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
|
|
|
) -> Bool {
|
2025-08-21 10:53:10 +08:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 09:45:15 +08:00
|
|
|
|
GeneratedPluginRegistrant.register(with: self)
|
|
|
|
|
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
|
|
|
}
|
2025-08-21 10:53:10 +08:00
|
|
|
|
|
|
|
|
|
// 关键:把当前的掩码提供给系统
|
|
|
|
|
override func application(_ application: UIApplication,
|
|
|
|
|
supportedInterfaceOrientationsFor window: UIWindow?)
|
|
|
|
|
-> UIInterfaceOrientationMask {
|
|
|
|
|
return AppDelegate.orientationMask
|
|
|
|
|
}
|
2025-07-03 09:45:15 +08:00
|
|
|
|
}
|