reactNative跨平台app开发经验分享-跨平台开发兼容

Author:Mr.柳上原

  • 付出不亚于任何的努力
  • 愿我们所有的努力,都不会被生活辜负
  • 不忘初心,方得始终

既然已经入了react坑

那自然不会少了移动端app开发神器RN

初衷依然是把自己在公司实际开发中遇到的踩坑填坑过程记录下来

给自己

也分享给同样从事这行的各位新入行朋友做个爬坑指南

首先
reactNative我在这里简称RN
RN是可以做跨平台开发的
这就导致了一个问题
RN的组件,在Android和ios上有些会有所不同
RN的样式编辑,在Android和ios上有些也会有所不同
这就涉及到了平台兼容
比较常见的兼容问题有:
大小,宽高,字体,不同手机系统的独占组件等等
如何解决这些问题
我是这样做的:

// 关于宽高大小
// 解决思路为,封装一个独立的工具函数,来处理手机不同大小尺寸的兼容

/**
 * Created by zhuoy on 2017/6/27.
 * 屏幕工具类
 * ui设计基准,iphone 6
 * width:750
 * height:1334
 */

/*
 设备的像素密度,例如:
 PixelRatio.get() === 1          mdpi Android 设备 (160 dpi)
 PixelRatio.get() === 1.5        hdpi Android 设备 (240 dpi)
 PixelRatio.get() === 2          iPhone 4, 4S,iPhone 5, 5c, 5s,iPhone 6,xhdpi Android 设备 (320 dpi)
 PixelRatio.get() === 3          iPhone 6 plus , xxhdpi Android 设备 (480 dpi)
 PixelRatio.get() === 3.5        Nexus 6       */

 import { Dimensions, PixelRatio } from 'react-native';

 export const deviceWidth = Dimensions.get('window').width;      //设备的宽度
 export const deviceHeight = Dimensions.get('window').height;    //设备的高度
 let fontScale = PixelRatio.getFontScale();                      //返回字体大小缩放比例
 
 let pixelRatio = PixelRatio.get();      //当前设备的像素密度
 const defaultPixel = 2;                           //iphone6的像素密度
 //px转换成dp
 const w2 = 750 / defaultPixel;
 const h2 = 1334 / defaultPixel;
 const scale = Math.min(deviceHeight / h2, deviceWidth / w2);   //获取缩放比例
 const scaleWidth = deviceWidth / w2
 /**
  * 设置text为sp
  * @param size sp
  * return number dp
*/

export function setSpText(size) {
  size = Math.round((size * scale + 0.5) * pixelRatio / fontScale);
  return size / defaultPixel;
}

export function scaleSize(size) { // 不适用小比例缩放
  size = Math.round(size * scaleWidth);
  return size / defaultPixel;
}
export function scaleWidthSize(size) {
  size = Math.round(size * scaleWidth);
  return size / defaultPixel;
}


// 一般我们会使用scaleSize这个函数,其他特殊地方使用另外两个函数处理
//使用方法
// 在页面引入该工具函数

import { scaleSize } from "../utils/screenUtil";

// 在标签内部写入行间样式
<View style={{marginRight: scaleSize(40)}}>
</View>

// 在css里写入外部样式
// 外部样式引用工具函数的方法:把外部样式用js写法表示
import { scaleSize } from "../utils/screenUtil";

const styles = StyleSheet.create({
  ListItem: {
        flexDirection: 'row',
        alignItems: 'center',
        paddingLeft: 15,
        paddingRight: 15,
        height: scaleSize(100),
        justifyContent: 'space-between',
    },
status: {
        position: 'absolute',
        right: scaleSize(15),
        top: scaleSize(15),
    },
    numberInput: {
        paddingRight: scaleSize(20),
    },
})
// 然后把该外部样式引入需要的页面
import { styles } from "../css/styles ";
// 调用该样式
<View style={styles.ListItem, styles.status, styles.numberInput}>
</View>

// 复合写法
// 同时使用外部样式和行内样式
<View style={[styles.ListItem, styles.status, styles.numberInput, {marginRight: scaleSize(40)}]}>
</View>
// 关于字体
// 需要注意一点
// ios改变字体需要在node_modules里引入字体库并进行关联设置,不然开发ios app的时候使用自定义字体时会报错,具体设置百度上都有
// 简单的方法是:如果Android实在需要自定义字体,可以使用系统监控,做ios的兼容判断,去除ios自定义字体
import { Platform } from 'react-native';
const ios = Platform.OS === 'ios';

<View style={{
      display: 'flex', flexDirection: 'column', 
      fontFamily: ios ? null : "PingFangSC-Regular",
}}>
</View>
// 关于兼容
// 跨平台兼容的思想就是系统监控,不同的系统做兼容判断
import { Platform } from 'react-native';
const ios = Platform.OS === 'ios';

// 比如
<View style={{
      display: 'flex', flexDirection: 'column', 
      fontFamily: ios ? null : "PingFangSC-Regular",
}}>
</View>

// 比如
<TabBar.Item title='首页'
       icon={ ios ? require('./images/sy_ios_select.png') : require('./images/sy.png')}
       selectedIcon={ ios ? require('./images/sy_ios_select.png') : require('./images/sy_select.png')}
       selected={this.state.selectedTab === 'index'} onPress={() => {Toast.hide(); this.changeTab('index');}}>
          {
            this.state.selectedTab === 'index'
            ? <View style={[LayerStyles.xyhLayer, {bottom: tabBottom}]}>
                   {Platform.OS === 'android' ? null : <StatusBar translucent={true} backgroundColor="rgba(0, 0, 0, 0.2)" />}
                       {           
                         <View style={[LayerStyles.scrollPanel, { backgroundColor: 'transparent', zIndex: 1 }]}>
                             {this.props.topbar}
                             {children} 
                          </View>
                        }
                         {
                           this.props.pageBackground
                           ? this.props.pageBackground
                           : null
                         }
                         {
                           this.props.showLoading
                           ? (<Spinner />)
                           : null
                          }
               </View>
               : null
            }
</TabBar.Item>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260