React Native 布局

React Native 版本 0.55.4

在使用React native 开发过程中,遇到了很多布局问题。

一、适配各种尺寸的屏幕

React native 要使用一套UI去适配各种屏幕,尤其是安卓拥有着各种尺寸的屏幕。一般设计UI时会参照375*667或者其他一个固定尺寸来进行设计。所以我们应该对设计的内容进行整体的缩放。

通过屏幕宽和设计图的宽的比例,计算出一个缩放值,然后整个页面中的所有高度大小相关的style(fontSize,lineHeight,margin,pading,width,height....)都乘以这个缩放值。但是这样在屏幕宽高比与设计图宽高比相差比较大的设备上时,可能会出现内容无法放下的情况,比如用375*667的设计图去按宽缩放时放在4s设备上运行。此时有两种解决方式,第一种,同时计算纵向的缩放值,与横向的缩放值做比较,取更小比例的值。

class Constant {
    //static 关键字用来定义一个类的一个静态方法。调用静态方法不需要实例化该类,但不能通过一个类实例调用静态方法。静态方法通常用于为一个应用程序创建工具函数。
    /*  widthStandard : 设计图宽度 默认375
     *  heightStandard : 设计图高度 默认667
     */
    static getPortraitScale = (widthStandard=375, heightStandard = 667) => {
        //取短的为宽
        let w = Dimensions.get("window").width;
        let h = Dimensions.get("window").height;
        let screenW = w > h ? h : w;
        let screenH = w > h ? w : h;
        //使用strand缩放后内容的高度
        let height = screenW / widthStandard * heightStandard;
        if (height < screenH) {
            return screenW / widthStandard;
        }
        return screenH / heightStandard;
    };
    //横屏获取缩放比
    static getLandscapeScale = (widthStandard=667, heightStandard = 375) => {
        //取长的为宽
        let w = Dimensions.get("window").width;
        let h = Dimensions.get("window").height;
        let screenW = w < h ? h : w;
        let screenH = w > h ? h : w;
        //使用strand缩放后内容的高度
        let height = screenW / widthStandard * heightStandard;
        if (height < screenH) {
            return screenW / widthStandard;
        }
        return screenH / heightStandard;
    };
}

二、横竖屏切换的问题

1.调整设备设置中的字体大小时,出现字体布局混乱的情况

安卓和iOS系统的设置中都有一个可以选择字体大小的选项。如果把字体放大后,App可能会出现文字布局混乱的情况。尤其在使用了lineHeight style后,文字可能会发生截断的情况。
解决方案:在<Text/>中使用allowFontScaling={false}
这个allowFontScaling可以用来解决字体同时放大的问题,但是这个参数有一些版本限制,在react-native 0.3X之前,这个参数只适用于iOS设备(网上查的资料,未证实)。
在0.51版本之前这个参数即使使用了,会有一个非常奇怪的bug,文字确实不会放大缩小,但是lineHeight还是会放大缩小。所以仍然有截断现象。而在目前最新的0.55.4的版本中bug被修复。显示正常。

2.Navgation Bar高度不一致问题

使用自定义的Bar时。安卓和iOS高度不一致。Android计算Nav高度是从手机顶部开始计算。而iOS默认会向下偏移状态栏的高度。要做到效果统一。需要将安卓的Bar的paddingTop属性设为状态栏高度

import {StatusBar, Platform} from "react-native";
navigationOptions = {
  ...
  headerStyle: {
      ...
      paddingTop: Platform.OS === "ios" ? 0 : StatusBar.currentHeight,
    },
 }

另外横屏后,iOS的横屏时navigation bar的高度只有32px 而安卓的不会改变

或者

使用React-Navigation 中的SafeArea ,将 <SafeArea/>包裹在根视图的最外层。此时视图是从状态栏下方开始布局的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,039评论 3 119
  • 这阶段在小区内有几个同龄的孩子都会一起轮流到各自的家里去串门。发现两个70后妈妈的家里打理得干净整洁。也许她们没有...
    悦心教育杨小媚阅读 2,713评论 0 0
  • 相送 总是一程接一程 最後 只是默默地行 撩落眼前的乱发 轻声 走吧 别担心 转身 孤單的背影 濛了眼睛、酸了心⋯...
    平天下之文世界阅读 1,449评论 7 5
  • 我不是一个女生,也不是女人,我是一个男生,也就是男人 我的青春不够浪,碰到的女生不够多 我...
    无瘾子阅读 1,241评论 0 0
  • 一 大地,像一个沉默的哑巴 无论人们在他身上做了什么 他都是笑一笑,不说话 二 当人们与岁月分道扬镳时 便拥有了一...
    鹤鸣n阅读 1,352评论 1 1