屏幕旋转
							parent
							
								
									4727e01e89
								
							
						
					
					
						commit
						3b95b8b58d
					
				|  | @ -1,13 +1,77 @@ | |||
| import Flutter | ||||
| 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 | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -86,17 +86,13 @@ class HttpManager { | |||
|       }) async { | ||||
|     Response resp; | ||||
|     final url = baseUrl + path; | ||||
|     final options = Options( | ||||
|       method: method.name.toUpperCase(), | ||||
|       contentType: headerType, | ||||
|     ); | ||||
| 
 | ||||
|     try { | ||||
|       switch (method) { | ||||
|         case Method.get: | ||||
|           final queryParameters = <String, dynamic>{}; | ||||
|           if (params != null) queryParameters.addAll(params); | ||||
|           if (data != null) queryParameters.addAll(data); | ||||
|           if (params != null && params.isNotEmpty) queryParameters.addAll(params); | ||||
|           if (data != null && data.isNotEmpty) queryParameters.addAll(data); | ||||
|           resp = await _dio.get( | ||||
|             url, | ||||
|             queryParameters: queryParameters, | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| import 'dart:math'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:package_info_plus/package_info_plus.dart'; | ||||
| import 'package:flutter_easyloading/flutter_easyloading.dart'; | ||||
| 
 | ||||
|  | @ -397,3 +398,13 @@ class NoDataWidget { | |||
|   } | ||||
| 
 | ||||
| } | ||||
| class NativeOrientation { | ||||
|   static const MethodChannel _channel = MethodChannel('app.orientation'); | ||||
| 
 | ||||
|   static Future<void> setLandscape() async { | ||||
|     await _channel.invokeMethod('setOrientation', 'landscape'); | ||||
|   } | ||||
|   static Future<void> setPortrait() async { | ||||
|     await _channel.invokeMethod('setOrientation', 'portrait'); | ||||
|   } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue