React Native 适配iPad

最近在用RN开发一款企业版的iPad版项目,在开发过程中不免会遇到适配的问题。比如长度的适配,字体大小的适配。一般情况下,Flex布局能帮我们解决一些适配问题,但大多数情况下,需要我们自己去解决。在此,我给大家介绍一下项目中是如何实现不同尺寸的iPad屏幕适配的。

首先,我们来看一组数据:

iPad设备(尺寸)                         分辨率                    点

iPad Pro(12.9 inch)          (2048x2732)  (1024x1366)                    

iPad Pro(9.7 inch)            (1536x2048)  (768x1024)

iPad1/2(9.7 inch)               (768x1024)    (768x1024)

iPad3/4/air(9.7 inch)         (1536x2048)  (768x1024)

iPad mini(9.7 inch)             (768x1024)    (768x1024)

iPad mini2(7.9 inch)         (1536x2048)     (768x1024)

                 (斜粗字体为Retina屏,其他为普屏)

在开发过程中,我们不必纠结于屏幕的分辨率是多少,我们只要关注屏幕的点就行了。苹果为了方便开发人员开发,在iOS中统一使用点(Point)对界面元素的大小进行描述。而点和像素的换算关系为:Retina屏 1点 = 2像素普屏 1点 = 1像素

当我们仔细观察上面的数据后发现,除了iPad Pro(12.9)的点为1024x1366其他iPad设备的点都为768x1024。所以我们只需考虑这两个点之间的比例关系就行了。屏宽比:1024 / 768 =  1.333333333, 屏高比:1366 / 1024 = 1.333984375, 经过计算我们发现两者之间的比例关系非常接近 4 : 3 。这样,我们在设置长度和字体的大小时,按着4:3的比例来进行就能很完美地适配了。

下面来加上部分RN代码来具体说明一下:

// LengthStyles.js  

import { Dimensions } from 'react-native';                                                                     const { width } = Dimensions.get('window');    

let LengthStyles = {};                                                                       LengthStyles.lengthRank1 = 3;                                                       LengthStyles.lengthRank2 = 6;                                                           LengthStyles.lengthRank15 = 45;                                                       LengthStyles.lengthRank20 = 60;                                                                                 if(width >1100){                                                                               LengthStyles.lengthRank1 = 4;                                                       LengthStyles.lengthRank2 = 8;                                                     LengthStyles.lengthRank15 = 60;                                                     LengthStyles.lengthRank20 = 80;                                                                                         };                                                                                                                                  export default LengthStyles;

// FontSizeStyles.js

import { Dimensions } from 'react-native';                                                                     const { width } = Dimensions.get('window');

let FontSizeStyles = {};                                                                      FontSizeStyles.lengthRank1 = 9;                                                      FontSizeStyles.lengthRank2 = 12;                                                          FontSizeStyles.lengthRank3 = 15;                                                      FontSizeStyles.lengthRank4 = 18;                                                                                if(width >1100){                                                                              FontSizeStyles.lengthRank1 = 12;                                                      FontSizeStyles.lengthRank2 = 16;                                                    FontSizeStyles.lengthRank3 = 20;                                                    FontSizeStyles.lengthRank4 = 24;                                                                                        };                                                                                                                                  export default FontSizeStyles;

这个两个文件可以放在同一个文件夹styles下,然后建一个index.js来引一下:

import FontSizeStyles from './FontSizeStyles';                                                           import LengthStyles from './LengthStyles';

export {                                                                                                          FontSizeStyles,                                                                                                    LengthStyles                                                                                                                      }

以后调用的话,直接 import {FontSizeStyles,LengthStyles } from 'xx/../styles' 即可。

如标注图尺寸是768x1024,其中一个Text 的宽度为45 (width:45),我们在给这个 Text 的 width 赋值时就写成 width:LengthStyles.lengthRank15。如果这个Text的字体大小为12 (fontSize: 12), 我们给这个Text的 fontSize 赋值时就写成 fontSize:FontSizeStyles.lengthRank2。根据 LengthStyles.js 和FontSizeStyles.js 代码,在1024x1366的尺寸中,Text 的宽就会变成60,字体大小就会变成16了,达到了适配效果。在实际开发中,如果遇到 LengthStyles.js 中没有的长度,自己往里面添加就行,往FontSizeStyles.js 中添加新的字体大小也是一样。

在适配的过程中,还需要注意一个地方,就是当标注的长度不为3的倍数怎么办?因为非3的倍数,你求得长度的 4/3 倍也就不为整数,如果UI要求比较高的话就四舍五入。如果UI要求还好的话,你就把非3倍数的长度加1或者减1来变成3的倍数,这样计算起来就比较容易了。

以上就是适配不同屏幕iPad的方法了。其实适配其他的尺寸,这个方法也是可以的。

很简单的方法,说起来只要几分钟,写起来却要几个小时,我要静静……

=====2017.8.1更新====

这里提供一种另一种方法:

import{ Dimensions } from 'react-native';

const deviceW = Dimensions.get('window').width

const basePx = 768 (多数iPad设备的点宽)

export default function pixelValue(px) {

return px * deviceW / basePx;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容