美文网首页
「React Native」UI适配

「React Native」UI适配

作者: 七月流火_9405 | 来源:发表于2020-05-22 16:50 被阅读0次

一、按比例对UI切图进行转化。

import { Dimensions, Platform } from 'react-native';
export const WIDTH = Dimensions.get('window').width;
export const HEIGHT = Dimensions.get('window').height;
export const isIOS = (Platform.OS === 'ios');//系统是iOS
// 设计图上的比例,宽度
let basePx = 360;
const deviceW = Dimensions.get('window').width;
/**
 * 适配宽高
 * @param {width、height} px 
 */
export function px2dp(px) {
  return px * deviceW / basePx;
}

/**
 * 适配字体
 * @param {width、height} px 
 */
export function px2sp(px) {
  return px * deviceW / basePx;
}

//iPhone X
const X_SCREEN_WIDTH = 375;
const X_SCREEN_HEIGHT = 812;

export function isIphoneX() {
  return (
    Platform.OS === 'ios' && ((X_SCREEN_WIDTH === WIDTH && X_SCREEN_HEIGHT === HEIGHT)
      || (X_SCREEN_WIDTH === HEIGHT && X_SCREEN_HEIGHT === WIDTH)
    )
  );
}

export default {
  WIDTH,
  HEIGHT,
  isIOS,
  isIphoneX,
  px2dp,
  px2sp
}

二、动态赋值

import Adapt, { px2dp, px2sp } from '../commons/Adapt'
import { StyleSheet } from 'react-native';

export default class StylesUtil {
    protected px2dp = px2dp
    protected px2sp = px2sp
    protected Adapt = Adapt

    static create<T extends StyleSheet.NamedStyles<T> | StyleSheet.NamedStyles<any>>(obj: T): T {
        this.updateSource(obj)
        //console.log("尺寸变化后:", obj);
        return StyleSheet.create(obj)
    }

    static updateSource(source) {
        Object.keys(source).forEach(k => {
            //console.log('开始遍历key:', k);
            //console.log('开始遍历value:', source[k]);
            //如果值是对象则继续遍历
            if (typeof source[k] === 'object') {
                this.updateSource(source[k])
            } else {
                if (typeof source[k] === 'number') {//只替换值类型为数字的情况
                    if (k === 'fontSize') {//如果是字体大小就转换为sp
                        source[k] = px2sp(source[k])
                    } else if (k === 'flex') {//如果是flex,则不做处理。 
                    } else if (k.indexOf('border') != -1) {//如果是border,则不做处理。
                    } else if (source[k] !== StyleSheet.hairlineWidth) {//如果是hairlineWidth,则不做处理。
                    } else {//否则转换为dp单位
                        source[k] = px2dp(source[k])
                    }
                }
            }
        })
    }

}

相关文章

网友评论

      本文标题:「React Native」UI适配

      本文链接:https://www.haomeiwen.com/subject/uqfcahtx.html