背景
跨端框架在不同的操作系统上呈现出相应平台的设计风格,但在应用开发中,我们通常倾向于使用一奏设计风格,如iOS风格。然而,这可能导致跨端框架在非iOS系统(如Android)上的UI与设计不符,产生UI bug。此外,两个平台上的功能特性也有差异。
问题
不同的平台对于UI的表现会有所差异,包括但不限于以下方面:
- 基础控件默认样式,如TextInput和Text控件在不同系统中的默认样式差异。
- 屏幕适配问题,特别是对iPhone X等设备的特殊处理。
- 阴影与模糊效果的实现,如安卓不支持阴影效果。
- 用户习惯的差异,如删除方式和返回机制的差异。
策略
基础控件样式
1,建议为输入框TextInput指定颜色,因为安卓不同机型下默认色不一致,导致显示不统一。 而且安卓下的placeholder默认颜色大概在#777,iOS下默认颜色大概在#ccc
2,如果为TextInput已设置颜色,再调整颜色,不能置空,否则会crash,推测可能是RN的bug
//Error
const invalidTextStyle = isContainEmoji ? {color: '#FF695C'}:null
//Right
const invalidTextStyle = isContainEmoji ? {color: '#FF695C'}:{color: 'FF2500'}
3,ios默认无下划线的,而在android默认有下划线,需要去掉,看下面代码:
<TextInput
underlineColorAndroid = "transparent" //android需要设置下划线为透明才能去掉下划线
>
</TextInput>
4,iOS下lineHeight属性正常支持,文本会显示在中间位置,Android下文本会显示在最底端,解决办法就是设置textAlignVertical垂直居中,或者设置 paddingBottom 属性,手动调整文本内容到居中位置。
textAlignVertical = 'center', //设置垂直居中
5,输入框组件,安卓平台无清除按钮,需要手动添加
6,Image 必须设置宽高才能正确渲染
<Image style={{width:8,height:12,}}
resizeMode={'contain'}
source={require('../../assets/images/me/me_icon_more.png')}/>
7,某些安卓机型下,圆角设置不生效,解决方法: 在原生的view外面,包一层View,并设置以下样式
overflow: 'hidden',
borderRadius: 6
8,安卓导航栏左侧按钮(返回按钮),只能放图片,不能放文本,一般遇到放“取消”的情况,都是用图片代替。
9,scrollview,在安卓上,若内容没有超出屏幕大小,不能滑动,ios是可以的。而且安卓上没有弹性效果。
屏幕适配
- 对于iPhone X的屏幕适配,可以使用SafeAreaView包裹你的View,或者对底部和顶部进行特定的空间留白处理。
- 对于安卓平台,由于导航栏和状态栏的高度在不同机型上是不确定的,我们可以使用onLayout方法来测量View的高度,从而计算出页面的真实高度。
阴影与模糊效果
- 对于iOS平台,我们可以直接使用系统提供的阴影效果。而对于Android平台,我们可以使用阴影图片来模拟阴影效果,比如使用ImageBackground作为背景或者使用**
absolute**属性控制阴影图的布局。
用户习惯
- 对于列表信息的删除方式,虽然iOS和Android的原生习惯不同,但在RN开发的页面中,我们可以统一使用左滑删除信息的方式。
- 对于返回机制,由于安卓有物理按键返回,而iOS只有手势侧滑返回,我们需要在处理返回事件时注意两端的差异。
效果
通过这些策略,我们可以有效地解决跨端开发中的UI表现差异问题,提供一致的用户体验。同时,这些策略也提高了开发效率,使得开发者能更好地关注业务逻辑的实现,而不必过于关注平台间的差异。