3.4.4 适配 iPhoneX 机型

iPhoneX 也是一个比较特殊的机型,当前程序在 iPhoneX 显示如图3-9所示。
图3-9 在 iPhoneX 上运行结果 图3-9 在 iPhoneX 上运行结果

由于 iPhoneX 顶部有刘海,四角是弧形的,底部有横线,所以顶部和底部都需要额外增加padding。修改 theme.js,代码如下:

import {Dimensions, Platform} from 'react-native';
export default module = {
    screenWidth: Dimensions.get('window').width,
    screenHeight: Dimensions.get('window').height,
    btnActiveOpacity: 0.5,
    actionBar: {
        height: 44,//Platform.OS === 'android' ? 56 : 44 //根据不通平台高度不一致
        backgroundColor: '#fff'
    },
    barContentPad: (Platform.OS === 'android' ? 0 : (isIphoneX() ? 42 : 20)),
    bottomPadding: isIphoneX() ? 18 : 0,
    // 常用颜色
    primaryColor: '#EE0000',
    lightGray: '#f5f5f5',
    darkGray: '#e5e5e5',
    lightBlack: '#333333'
};


export function isIphoneX() {
    let dimension = Dimensions.get('window');
    return (
        Platform.OS === 'ios' &&
        !Platform.isPad &&
        !Platform.isTVOS &&
        (dimension.height === 812 || dimension.width === 812)
    );
}

isIphoneX() 用来判断是否是 iPhoneX 机型,iOS 机型中只有 iPhoneX 的高度是 812 个单位(iPhoneX 分辨率为 2436*1125,RN一个单位在iPhoneX 上转换为3像素),无论横屏或者竖屏,宽和高总有一个是 812,barContentPad 用来处理顶部 padding ,当手机为 iPhoneX 时高度为42,bottomPadding 以后用来处理底部 padding ,iPhoneX 为 18 。运行结果如图3-10所示。
图3-10 运行结果图3-10 运行结果

除了这些,为了方便适配 iPhoneX ,RN 提供了 SafeAreaView ,文档地址:http://facebook.github.io/react-native/docs/safeareaview.html
同时 react-navigation 也提供了名字一样的组件,左右也是一样,适用于顶部没有 Header 和 底部标签栏的界面 (这些界面 react-navigation 已经帮我们适配好了)。这个组件作为页面的最外层组件,参考代码:

import { SafeAreaView } from 'react-navigation';

class App extends Component {
  render() {
    return (
      <SafeAreaView style={styles.container}>
        <Text style={styles.paragraph}>
          This is top text.
        </Text>
        <Text style={styles.paragraph}>
          This is bottom text.
        </Text>
      </SafeAreaView>
    );
  }
}

查看代码

如果你已经从 GitHub 上克隆了这个程序的 Git 仓库,那么可以执行 git checkout 3e 签出程序的这个版本。

results matching ""

    No results matching ""