溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

React Native如何消除啟動(dòng)時(shí)白屏的方法

發(fā)布時(shí)間:2020-09-10 17:51:41 來(lái)源:腳本之家 閱讀:364 作者:code_xzh 欄目:web開發(fā)

在RN 項(xiàng)目啟動(dòng)之后有一個(gè)短暫的白屏,調(diào)試階段白屏的時(shí)間較長(zhǎng),大概3-5秒,打正式包后這個(gè)白屏?xí)r間會(huì)大大縮短,大多時(shí)候都是一閃而過(guò),所以稱之為“閃白”。

React Native如何消除啟動(dòng)時(shí)白屏的方法

React Native如何消除啟動(dòng)時(shí)白屏的方法

其實(shí)解決的方案也有很多,這里做一個(gè)簡(jiǎn)單的總結(jié)。

白屏的原因

在iOS App 中有 啟動(dòng)圖(LaunchImage),啟動(dòng)圖結(jié)束后才會(huì)出現(xiàn)上述的閃白,這個(gè)過(guò)程是 js 解釋的過(guò)程,JS 解釋完畢之前沒(méi)有內(nèi)容,所以才表現(xiàn)出白屏,那么解決的方法就是在啟動(dòng)圖結(jié)束后,JS 解釋完成前做一些簡(jiǎn)單的處理。

解決的常見方案:

  • 啟動(dòng)圖結(jié)束后通過(guò)原生代碼加載一張全屏占位圖片,跟啟動(dòng)圖一樣的圖片,混淆視聽“欺騙用戶”。
  • JS解釋完畢后通知原生可以移除占位圖
  • 收到 JS 發(fā)來(lái)的可以移除占位圖的通知,移除占位圖

代碼實(shí)現(xiàn)

新建一個(gè)SplashScreen 文件用來(lái)接收 JS 發(fā)來(lái)的”移除占位圖”的消息。相關(guān)代碼如下:

SplashScreen.h

#import <Foundation/Foundation.h>
 #import "RCTBridgeModule.h"
 @interface SplashScreen : NSObject<RCTBridgeModule>

 @end

SplashScreen.m

#import "SplashScreen.h"
 @implementation SplashScreen

 RCT_EXPORT_MODULE();

 RCT_EXPORT_METHOD(close){
  [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_CLOSE_SPLASH_SCREEN" object:nil];
 }
 @end

在AppDelegate.m 加入以下代碼:

@interface AppDelegate ()
 {
  UIImageView *splashImage;
 }
 @end

 @implementation AppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(closeSplashImage) name:"Notification_CLOSE_SPLASH_SCREEN" object:nil];

   ...
   [self autoSplashScreen];//寫在 return YES 之前,其他代碼之后
   return YES;
 }
 -(void)autoSplashScreen {
  if (!splashImage) {
   splashImage = [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
  }
  if (IPHONESCREEN3p5) {
   [splashImage setImage:[UIImage imageNamed:@"launch5"]];
  }else if (IPHONESCREEN4){
   [splashImage setImage:[UIImage imageNamed:@"launch6"]];
  }else if (IPHONESCREEN4p7){
   [splashImage setImage:[UIImage imageNamed:@"launch7"]];
  }else if (IPHONESCREEN5p5){
   [splashImage setImage:[UIImage imageNamed:@"launch7"]];
  }
  [self.window addSubview:splashImage];
 }
 -(void)closeSplashImage {
    dispatch_sync(dispatch_get_main_queue(), ^{
     [UIView animateWithDuration:0.5 animations:^{
      splashImage.alpha = 0;
     } completion:^(BOOL finished){
      [splashImage removeFromSuperview];
     }];
    });
 }

在合適的時(shí)機(jī)選擇移除占位圖。js端代碼:

if (Platform.OS === 'ios') {
   NativeModules.SplashScreen.close();
 };

 更加詳細(xì)的信息可以訪問(wèn):https://github.com/crazycodeboy/react-native-splash-screen/blob/master/README.zh.md

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI