React Native如何消除启动时白屏的方法


Posted in Javascript onAugust 08, 2017

在RN 项目启动之后有一个短暂的白屏,调试阶段白屏的时间较长,大概3-5秒,打正式包后这个白屏时间会大大缩短,大多时候都是一闪而过,所以称之为“闪白”。

React Native如何消除启动时白屏的方法

React Native如何消除启动时白屏的方法

其实解决的方案也有很多,这里做一个简单的总结。

白屏的原因

在iOS App 中有 启动图(LaunchImage),启动图结束后才会出现上述的闪白,这个过程是 js 解释的过程,JS 解释完毕之前没有内容,所以才表现出白屏,那么解决的方法就是在启动图结束后,JS 解释完成前做一些简单的处理。

解决的常见方案:

  • 启动图结束后通过原生代码加载一张全屏占位图片,跟启动图一样的图片,混淆视听“欺骗用户”。
  • JS解释完毕后通知原生可以移除占位图
  • 收到 JS 发来的可以移除占位图的通知,移除占位图

代码实现

新建一个SplashScreen 文件用来接收 JS 发来的”移除占位图”的消息。相关代码如下:

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:@"launch4"]];
  }else if (IPHONESCREEN4){
   [splashImage setImage:[UIImage imageNamed:@"launch5"]];
  }else if (IPHONESCREEN4p7){
   [splashImage setImage:[UIImage imageNamed:@"launch6"]];
  }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];
     }];
    });
 }

在合适的时机选择移除占位图。js端代码:

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

 更加详细的信息可以访问:https://github.com/crazycodeboy/react-native-splash-screen/blob/master/README.zh.md

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js+FSO遍历文件夹下文件并显示
Mar 07 Javascript
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
javascript中数组的concat()方法使用介绍
Dec 18 Javascript
非常实用的12个jquery代码片段
Nov 02 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
javascript获取图片的top N主色值方法详解
Jan 26 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
简单了解常用的JavaScript 库
Jul 16 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 Javascript
react native带索引的城市列表组件的实例代码
Aug 08 #Javascript
React Native仿美团下拉菜单的实例代码
Aug 08 #Javascript
React-Native 组件之 Modal的使用详解
Aug 08 #Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 #jQuery
超级简易的JS计算器实例讲解(实现加减乘除)
Aug 08 #Javascript
浅谈ES6新增的数组方法和对象
Aug 08 #Javascript
Angularjs上传文件组件flowjs功能
Aug 07 #Javascript
You might like
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php封装的smarty类完整实例
2016/10/19 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
详解Python中where()函数的用法
2018/03/27 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
python创建学生成绩管理系统
2019/11/22 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
授权委托书样本及填写说明
2014/09/19 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技