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 相关文章推荐
jQuery1.6 使用方法一
Nov 23 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
js遍历td tr等html元素
Dec 13 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
jQuery on()方法使用技巧详解
Apr 16 Javascript
jquery validate表单验证的基本用法入门
Jan 18 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
node.js实现端口转发
Apr 14 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
Aug 01 Javascript
基于Vue框架vux组件库实现上拉刷新功能
Nov 28 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
php检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
基于php编程规范(详解)
2017/08/17 PHP
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python配置grpc环境
2019/01/01 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
药物学专业学生的自我评价
2013/10/27 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
元旦标语大全
2014/10/09 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
工伤私了协议书范本
2014/11/24 职场文书
项目验收申请报告
2015/05/15 职场文书
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
Consul在linux环境的集群部署
2022/04/08 Servers
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android