ReactNative Mobile App 适配性优化实战

举报
SHQ5785 发表于 2023/04/26 08:51:05 2023/04/26
【摘要】 一、前言在前期博文《ReactNative进阶(四十四):Mobile App适配性优化》中介绍了RN在移动端开发中所应用的主要布局方式:Flex弹性布局。实践出真知,在实际编程过程中还是会遇到各种终端适配问题,此篇博文讲解实战项目开发过程中移动应用适配性问题优化。 二、适配实战以下面的布局为例,上面的页面布局主要分为若干个模块,每个模块根据自己的内容大小进行适配。在最初开发时,应用hei...

一、前言

在前期博文《ReactNative进阶(四十四):Mobile App适配性优化》中介绍了RN在移动端开发中所应用的主要布局方式:Flex弹性布局。实践出真知,在实际编程过程中还是会遇到各种终端适配问题,此篇博文讲解实战项目开发过程中移动应用适配性问题优化。

二、适配实战

以下面的布局为例,
在这里插入图片描述
上面的页面布局主要分为若干个模块,每个模块根据自己的内容大小进行适配。在最初开发时,应用height属性设置元素固定高度,发现应用此方式完全错误,当适配内容固定时无问题,但是适配内容动态显示时,就会出现内容溢出或留白太多的问题。接下来考虑应用height属性值设置为动态计算值方式,例如<View style={{ height: contentHeight - 60 }}>,其中,contentHeight通过如下方式计算所得:

import { Dimensions } from 'react-native';
const { width, height } = Dimensions.get('window');
const contentHeight = height - Dimens.headerHeight - Dimens.safeAreaBottom - 5 - 0.12 * width; // 计算可视高度

鉴于APP状态栏导航栏之说,在页面布局时还需考虑适配区域排除以上区域。状态栏、导航栏计算方式如下:

import { Dimensions, ScaledSize, StatusBar, Platform, NativeModules } from 'react-native';

const { StatusBarManager } = NativeModules;
const { width, height, scale, fontScale } = Dimensions.get('screen');

// 状态栏高度
let STATUSBAR_HEIGHT = 0;
if (Platform.OS === 'ios') {
  const statusHeight = NativeModules.AppDimens.statusBarHeight;
  STATUSBAR_HEIGHT = statusHeight;
} else {
  STATUSBAR_HEIGHT = StatusBarManager.HEIGHT;
}

// 导航栏高度
let NAVIGATION_HEIGHT = 0;
if (Platform.OS === 'ios') {
  const navigationHeight = NativeModules.AppDimens.navigationHeight;
  NAVIGATION_HEIGHT = navigationHeight;
} else {
  NAVIGATION_HEIGHT = 48;
}

// 底部安全区高度(针对iOS安全区适配)
let SAFE_AREA_BOTTOM = 0;
if (Platform.OS === 'ios') {
  const safeAreaBottom = NativeModules.AppDimens.safeAreaBottom;
  SAFE_AREA_BOTTOM = safeAreaBottom;
}

export const Dimens = {
  headerHeight: NAVIGATION_HEIGHT + STATUSBAR_HEIGHT, // header高度(状态栏高度加标题栏高度)
  statusBarHeight: STATUSBAR_HEIGHT, //状态栏高度
  titleHeight: NAVIGATION_HEIGHT, // 标题栏高度
  safeAreaBottom: SAFE_AREA_BOTTOM, //底部安全区高度
  iosPadding: 2, //ios要默认添加此padding(尤其是竖直方向上)
};

其中,Dimensions.get('window')表示获取屏幕窗口高度。即下图黄色与蓝色区域。
import { Dimensions } from "react-native";const deviceHeight = Dimensions.get('window').height;

有关视图窗口高度、屏幕高度及内容高度的计算方式如下:

  1. 窗口高度

即图中 黄色+蓝色 部分

import { Dimensions } from "react-native";
const deviceHeight = Dimensions.get('window').height;  
  1. 屏幕高度

即图中 黄色+蓝色+红色 部分

import { Dimensions } from "react-native";
const deviceHeight = Dimensions.get('screen').height;  
  1. 内容高度

即图中 蓝色 部分

import { StyleSheet, View, Text, ScrollView, Dimensions, PanResponder, StatusBar } from "react-native";
const deviceHeight = Dimensions.get('window').height;  
const STATUS_BAR_HEIGHT = StatusBar.currentHeight; // 状态栏高度,即图中黄色部分
const height = deviceHeight  - STATUS_BAR_HEIGHT;

应用以上动态设置height高度的方式,可以做到屏幕适配,

另外,minHeight:0,当有多个div盒子的时候,需要解决div盒子之间的嵌套关系。应用height:inherit可从父元素继承 height 属性的值。

三、拓展阅读

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。