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 相关文章推荐
表单的焦点顺序tabindex和对应enter键提交
Jan 04 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JavaScript中split() 使用方法汇总
Apr 17 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
微信小程序手动添加收货地址省市区联动
May 18 Javascript
原生js实现放大镜组件
Jan 22 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
PHP与已存在的Java应用程序集成
2006/10/09 PHP
php Calender(日历)代码分享
2014/01/03 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
php精度计算的问题解析
2019/06/21 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
js实现简单的打印表格
2020/01/15 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
学校司机岗位职责
2013/11/14 职场文书
运动会领导邀请函
2014/01/10 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
欢度春节标语
2014/07/01 职场文书
学期个人工作总结
2015/02/13 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
会议主持词通用版
2019/04/02 职场文书