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 相关文章推荐
Flex通过JS获取客户端IP和计算机名的实例代码
Nov 21 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
javascript实现控制div颜色
Jul 07 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
javascript实现tab切换的四种方法
Nov 05 Javascript
九种原生js动画效果
Nov 11 Javascript
JavaScript浏览器对象之一Window对象详解
Jun 03 Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
ES6 Object方法扩展的应用实例分析
Jun 25 Javascript
微信小程序中button去除默认的边框实例代码
Aug 01 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 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写出自己的BLOG系统 2
2010/04/12 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
对python中assert、isinstance的用法详解
2019/11/27 Python
python实现在一个画布上画多个子图
2020/01/19 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
全民健身日活动方案
2014/01/29 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
后进生评语大全
2015/01/04 职场文书
2015年中个人总结范文
2015/03/10 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers