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与jquery中获取当前鼠标的x、y坐标位置的代码
May 23 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
详解webpack 热更新优化
Sep 13 Javascript
vue项目中使用Svg的方法
Oct 24 Javascript
angular学习之动态创建表单的方法
Dec 07 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 Javascript
JavaScript实现页面高亮操作提示和蒙板
Jan 04 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
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
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
php中几种常见安全设置详解
2010/04/06 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
python基础教程项目三之万能的XML
2018/04/02 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
Python学习之time模块的基本使用
2021/01/17 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
行政部主管岗位职责
2013/12/28 职场文书
小学数学课后反思
2014/04/23 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
小学生暑假安全公约
2015/07/14 职场文书
2016春季运动会前导词
2015/11/25 职场文书
2016国培学习心得体会
2016/01/08 职场文书