最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter 控制屏幕旋轉(zhuǎn)的實(shí)現(xiàn)

 更新時(shí)間:2020年09月18日 15:30:53   作者:一天清晨  
這篇文章主要介紹了Flutter 控制屏幕旋轉(zhuǎn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近需要做個(gè)平板的項(xiàng)目,然后需要直接橫屏,有2種實(shí)現(xiàn)方式。

1, 隨著屏幕旋轉(zhuǎn),布局自動(dòng)調(diào)整。做橫豎屏適配

2,強(qiáng)制屏幕橫屏,不隨著屏幕去調(diào)整

第一種方式這里就不做說(shuō)明了。代碼做適配就可以。 下面說(shuō)一下第二種實(shí)現(xiàn)方式

Flutter 自帶方式

flutter 為我們提供了方法來(lái)控制系統(tǒng)的橫豎屏顯示

 SystemChrome.setPreferredOrientations([
   DeviceOrientation.landscapeLeft,
   DeviceOrientation.landscapeRight,
   DeviceOrientation.portraitUp,
   DeviceOrientation.portraitDown
  ]).then((_) {
  });

包含的方向類型。 ?。。?!但是但是但是這個(gè)方法只適用于android在iOS上沒(méi)有效果,上網(wǎng)查資料有大神封裝的 flutter插件orientation ,flutter插件auto_orientation 在iOS上都起不到效果,所以打算自己寫(xiě)一個(gè)原生文件與flutter進(jìn)行通訊,實(shí)現(xiàn)屏幕旋轉(zhuǎn)。也是筆者在查詢資料之后做的一個(gè)整合和解釋說(shuō)明

iOS端實(shí)現(xiàn)屏幕旋轉(zhuǎn)

創(chuàng)建iOS原生文件

創(chuàng)建iOS原生文件來(lái)實(shí)現(xiàn)交互,首先要?jiǎng)?chuàng)建個(gè)原生文件。命名為FlutterIOSDevicePlugin。 創(chuàng)建文件

創(chuàng)建一個(gè)命名為FlutterIOSDevicePlugin.h 和命名為FlutterIOSDevicePlugin.m文件,說(shuō)明一下: FlutterIOSDevicePlugin.h文件選擇圖片里面的header File模塊創(chuàng)建即可。

創(chuàng)建之后,一起看一下FlutterIOSDevicePlugin.h里面的代碼

#ifndef FlutterIOSDevicePlugin_h
#define FlutterIOSDevicePlugin_h

#import <Flutter/Flutter.h>

@interface FlutterIOSDevicePlugin : NSObject<FlutterPlugin>
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar flutterViewController:(FlutterViewController*) controller;
- (instancetype)newInstance:(NSObject<FlutterPluginRegistrar>*)registrar flutterViewController:(FlutterViewController*) controller;
@end
#endif /* FlutterIOSDevicePlugin_h */

這個(gè)不需要過(guò)多說(shuō)明了看一下FlutterIOSDevicePlugin.m的代碼

#import <Foundation/Foundation.h>
#import "FlutterIOSDevicePlugin.h"

@interface FlutterIOSDevicePlugin () {
  NSObject<FlutterPluginRegistrar> *_registrar;
  FlutterViewController *_controller;
}
@end

static NSString* const CHANNEL_NAME = @"flutter_ios_device";
static NSString* const METHOD_CHANGE_ORIENTATION = @"change_screen_orientation";
static NSString* const ORIENTATION_PORTRAIT_UP = @"portraitUp";
static NSString* const ORIENTATION_PORTRAIT_DOWN = @"portraitDown";
static NSString* const ORIENTATION_LANDSCAPE_LEFT = @"landscapeLeft";
static NSString* const ORIENTATION_LANDSCAPE_RIGHT = @"landscapeRight";

@implementation FlutterIOSDevicePlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
                   methodChannelWithName:CHANNEL_NAME
                   binaryMessenger:[registrar messenger]];
  FlutterIOSDevicePlugin* instance = [[FlutterIOSDevicePlugin alloc] newInstance:registrar flutterViewController:nil];
  [registrar addMethodCallDelegate:instance channel:channel];
}

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar flutterViewController:(FlutterViewController*) controller {
  FlutterMethodChannel* channel = [FlutterMethodChannel
                   methodChannelWithName:CHANNEL_NAME
                   binaryMessenger:[registrar messenger]];
  FlutterIOSDevicePlugin* instance = [[FlutterIOSDevicePlugin alloc] newInstance:registrar flutterViewController:controller];
  [registrar addMethodCallDelegate:instance channel:channel];
}

- (instancetype)newInstance:(NSObject<FlutterPluginRegistrar>*)registrar flutterViewController:(FlutterViewController*) controller{
  _registrar = registrar;
  _controller = controller;
  return self;
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([METHOD_CHANGE_ORIENTATION isEqualToString:call.method]) {
    NSArray *arguments = call.arguments;
    NSString *orientation = arguments[0];
    NSNumber *index = [NSNumber numberWithInt: [call.arguments[0] intValue]];
    NSInteger iOSOrientation;
     if ([orientation isEqualToString:ORIENTATION_LANDSCAPE_LEFT]){
           iOSOrientation = UIDeviceOrientationLandscapeLeft;
         }else if([orientation isEqualToString:ORIENTATION_LANDSCAPE_RIGHT]){
           iOSOrientation = UIDeviceOrientationLandscapeRight;
         }else if ([orientation isEqualToString:ORIENTATION_PORTRAIT_DOWN]){
           iOSOrientation = UIDeviceOrientationPortraitUpsideDown;
         }else{
           iOSOrientation = UIDeviceOrientationPortrait;
         }

    [[UIDevice currentDevice] setValue:@(iOSOrientation) forKey:@"orientation"];
//    [[NSNotificationCenter defaultCenter] postNotificationName:@"FlutterIOSDevicePlugin" object:nil userInfo:@{@"orientationMask": index}];
//    [UIViewController attemptRotationToDeviceOrientation];

    result(nil);
  } else {
    result(FlutterMethodNotImplemented);
  }
}
@end

以上是全部的代碼,其中嘗試了用通知的方式去做屏幕旋轉(zhuǎn),后來(lái)發(fā)現(xiàn)其實(shí)沒(méi)有那么麻煩,直接采用的是

[[UIDevice currentDevice] setValue:@(iOSOrientation) forKey:@"orientation"];

方式做的。其中遇到的問(wèn)題:

問(wèn)題1:iphone手機(jī)上可以正常旋轉(zhuǎn),ipad上不行

這個(gè)問(wèn)題主要原因是info。plist文件里面的iphone和ipad不一致,且勾選Requires full screen 即可

回到正軌哈

注冊(cè)原生插件文件

iOS 工程種有個(gè)GeneratedPluginRegistrant.m文件,直接注冊(cè)就可以了。 如果你項(xiàng)目引入了其他第三方插件,也是統(tǒng)一在這個(gè)地方注冊(cè)的

#import "GeneratedPluginRegistrant.h"

#if __has_include(<auto_orientation/AutoOrientationPlugin.h>)
#import <auto_orientation/AutoOrientationPlugin.h>
#else
@import auto_orientation;
#endif

#if __has_include(<orientation/OrientationPlugin.h>)
#import <orientation/OrientationPlugin.h>
#else
@import orientation;
#endif
#import "FlutterIOSDevicePlugin.h"

@implementation GeneratedPluginRegistrant

+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
 [AutoOrientationPlugin registerWithRegistrar:[registry registrarForPlugin:@"AutoOrientationPlugin"]];
 [OrientationPlugin registerWithRegistrar:[registry registrarForPlugin:@"OrientationPlugin"]];
//  [registry registrarForPlugin:@"FlutterIOSDevicePlugin"];
  

  [FlutterIOSDevicePlugin registerWithRegistrar: [registry registrarForPlugin:@"FlutterIOSDevicePlugin"]];
}

@end

代碼中的這個(gè)片段是自己寫(xiě)的插件注冊(cè)的方法,其他的AutoOrientationPlugin,OrientationPlugin是引用第三方插件自動(dòng)生成的代碼。

[FlutterIOSDevicePlugin registerWithRegistrar: [registry registrarForPlugin:@"FlutterIOSDevicePlugin"]];

AppDelegate文件中的設(shè)置

import UIKit
import Flutter



@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
 var orientationMask: UIInterfaceOrientationMask = .all;
  
 override func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
 ) -> Bool {
  NotificationCenter.default.addObserver(self, selector: #selector(changeLandscape(center:)), name:NSNotification.Name(rawValue: "FlutterIOSDevicePlugin"), object: nil)
  GeneratedPluginRegistrant.register(with: self);
  return super.application(application, didFinishLaunchingWithOptions: launchOptions)
 }
  override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return orientationMask;
  }
  
  @objc func changeLandscape(center: Notification){
    let index: NSNumber = (center.userInfo?["orientationMask"] ?? 5) as! NSNumber
    var mask : UIInterfaceOrientationMask = .all
    switch index {
    case 0:
      mask = .portrait
      break
    case 1:
      mask = .landscapeLeft
      break
    case 2:
      mask = .landscapeRight
      break
    case 3:
      mask = .portraitUpsideDown
      break
    case 4:
      mask = .landscape
      break
    case 5:
      mask = .all
      break
    case 6:
      mask = .allButUpsideDown
      break
    
    default:
      mask = .all
      break
    }
    orientationMask = mask;
    _ = application(UIApplication.shared, supportedInterfaceOrientationsFor: UIApplication.shared.keyWindow)
  }
}

其中changeLandscape方法是控制監(jiān)聽(tīng)的事件的方法,目前沒(méi)什么用。 主要代碼是這一段,這個(gè)是在發(fā)出屏幕旋轉(zhuǎn)的時(shí)候回調(diào)的方法,這里面設(shè)置的是全部的方向都可以。

  override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return orientationMask;
  }

問(wèn)題2:程序不走該方法

具體原因是因?yàn)閕nfo.plist文件問(wèn)題。參考上面設(shè)置就沒(méi)問(wèn)題

flutter 原生代碼使用

這個(gè)地方是針對(duì)于iOS平臺(tái)去做的區(qū)別。

MethodChannel _channel = const MethodChannel('flutter_ios_device');

@override
 void initState() {
  SystemChrome.setPreferredOrientations([
   DeviceOrientation.landscapeLeft,
   DeviceOrientation.landscapeRight,
   DeviceOrientation.portraitUp,
   DeviceOrientation.portraitDown
  ]).then((_) {
   if (Platform.isIOS) {
    this.changeScreenOrientation(DeviceOrientation.landscapeLeft);
   }
  });
  super.initState();
 }
 
Future<void> changeScreenOrientation(DeviceOrientation orientation) {
  String o;
  switch (orientation) {
   case DeviceOrientation.portraitUp:
    o = 'portraitUp';
    break;
   case DeviceOrientation.portraitDown:
    o = 'portraitDown';
    break;
   case DeviceOrientation.landscapeLeft:
    o = 'landscapeLeft';
    break;
   case DeviceOrientation.landscapeRight:
    o = 'landscapeRight';
    break;
  }
  return _channel.invokeMethod('change_screen_orientation', [o]);
 }

代碼不用過(guò)多說(shuō)明了, 有不了解的可以留言

問(wèn)題3: 啟動(dòng)程序自動(dòng)旋轉(zhuǎn)

SystemChrome.setPreferredOrientations需要設(shè)置全部?jī)?nèi)容。不然會(huì)默認(rèn)旋轉(zhuǎn)。有點(diǎn)小坑,

以上基本上可以實(shí)現(xiàn)屏幕旋轉(zhuǎn)的問(wèn)題,如果有小伙伴還是不行,可以試一下用iOS原生通知的方式去完成。這個(gè)我做的是平板的項(xiàng)目,暫時(shí)沒(méi)有問(wèn)題,更多相關(guān)Flutter 控制屏幕旋轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android QQ新用戶注冊(cè)界面繪制

    Android QQ新用戶注冊(cè)界面繪制

    這篇文章主要為大家詳細(xì)介紹了Android QQ新用戶注冊(cè)界面繪制代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android PhotoView使用步驟實(shí)例詳解

    Android PhotoView使用步驟實(shí)例詳解

    這篇文章主要介紹了Android PhotoView使用步驟實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android 對(duì)話框 Dialog使用實(shí)例講解

    Android 對(duì)話框 Dialog使用實(shí)例講解

    對(duì)話框是在當(dāng)前的頁(yè)面之上彈出的小窗口, 用于顯示一些重要的提示信息, 提示用戶的輸入,確認(rèn)信息,或顯示某種狀態(tài).如 : 顯示進(jìn)度條對(duì)話框, 退出提示.接下來(lái)通過(guò)本文給大家介紹android dialog對(duì)話框知識(shí),感興趣的朋友一起看看吧
    2016-09-09
  • Flutter使用socketIo實(shí)現(xiàn)實(shí)時(shí)通訊

    Flutter使用socketIo實(shí)現(xiàn)實(shí)時(shí)通訊

    本文主要介紹了Flutter使用socketIo實(shí)現(xiàn)實(shí)時(shí)通訊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 詳解Android應(yīng)用開(kāi)發(fā)--MP3音樂(lè)播放器代碼實(shí)現(xiàn)(一)

    詳解Android應(yīng)用開(kāi)發(fā)--MP3音樂(lè)播放器代碼實(shí)現(xiàn)(一)

    這篇文章主要介紹了詳解Android應(yīng)用開(kāi)發(fā)--MP3音樂(lè)播放器代碼實(shí)現(xiàn)(一),非常具有實(shí)用價(jià)值,需要的朋友可以參考下 。
    2017-01-01
  • Android Studio 3.6 調(diào)試 smali的全過(guò)程

    Android Studio 3.6 調(diào)試 smali的全過(guò)程

    這篇文章主要介紹了Android Studio 3.6 調(diào)試 smali, 目前最新版的 Android Studio 利用附加功能調(diào)試 smali 非常方便,具體操作步驟跟隨小編一起看看吧
    2020-02-02
  • Android編譯的注意事項(xiàng)

    Android編譯的注意事項(xiàng)

    今天小編就為大家分享一篇關(guān)于Android編譯的注意事項(xiàng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 詳解OpenGL Shader抗鋸齒的實(shí)現(xiàn)

    詳解OpenGL Shader抗鋸齒的實(shí)現(xiàn)

    普通繪制圓形形狀時(shí)可以看到圖形邊緣會(huì)有明顯鋸齒現(xiàn)象并不像真實(shí)圓形形狀一樣圓潤(rùn)邊緣平滑。本文將介紹如何通過(guò)自制函數(shù)實(shí)現(xiàn)抗鋸齒,需要的可以參考一下
    2022-02-02
  • Android中l(wèi)istview嵌套scrollveiw沖突的解決方法

    Android中l(wèi)istview嵌套scrollveiw沖突的解決方法

    這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫(huà)效果

    Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫(huà)效果

    這篇文章主要介紹了 Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫(huà)效果的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01

最新評(píng)論

林甸县| 博湖县| 隆昌县| 柳江县| 西乌珠穆沁旗| 正安县| 台北市| 慈利县| 屯昌县| 泾源县| 塔城市| 丹巴县| 光泽县| 偃师市| 新建县| 东阳市| 吴忠市| 屯门区| 江津市| 屏南县| 安丘市| 邢台县| 平和县| 滦南县| 铜山县| 萨嘎县| 桐乡市| 双流县| 宜兰市| 蒲江县| 仪陇县| 城口县| 钟祥市| 鲁甸县| 阿图什市| SHOW| 鄱阳县| 九龙坡区| 拉孜县| 会理县| 石首市|