最近在项目中,使用TextInput组件的时候,发现键盘弹出的时候,遮盖了表单。
咨询了下做iOS的同学,他们的处理是计算键盘的高度和当前输入域的位置,将界面向上移动一段距离。
那在ReactNative中是否也可以有类似的处理方法呢?
答案是肯定的,我们使用ScrollVIew的scrollTo方法,我们也主要是讲这种方法。
具体方案如下:
组件render方法中使用ScrollView,并且设置scrollview的keyboardShouldPersistTaps={true}
keyboardShouldPersistTaps bool 默认值为false。
当此属性为false的时候,在软键盘激活之后,点击焦点文本输入框以外的地方,键盘就会隐藏。
如果为true,滚动视图不会响应点击操作,并且键盘不会自动消失。
在scrollview中用一个view作为Container包裹所有剩余的子视图,比如Text,TouchableHighlight之类的;
并且用onStartShouldSetResponderCapture截取该view的事件,用以解决当点击页面上的按钮时,第一次点击只会收起键盘,第二次点击才会响应按钮方法的bug。
然后在TextInput的onFocus方法中滚动scrollview,在onEndEditing中恢复scrollview的滚动。
具体的代码如下:
在render方法里定义一个ScrollView,在ScrollView中有一个子View。
- <ScrollView ref='scroll' keyboardShouldPersistTaps={true} >
- <View onStartShouldSetResponderCapture={(e) => {
- let target = e.nativeEvent.target;
- if (target !== ReactNative.findNodeHandle(this.refs.hour) ) {
- this.refs.hour.blur();
- }
- }}>
- </View>
- </ScrollView>
View里的TextInput的代码如下:
- <TextInput
- style={styles.ksValueView}
- maxLength={2}
- placeholder="0"
- placeholderTextColor="#b2b2b2"
- multiline={false}
- onChangeText={this.changeHour.bind(this)}
- keyboardType="numeric"
- ref = 'hour'
- onFocus={this.scrollViewTo.bind(this)}
- onEndEditing={()=>{this.refs.scroll.scrollTo({y:0,x:0,animated:true})}}
- />
onFocus方法中滚动scrollview,在onEndEditing中恢复scrollview的滚动。
滚动函数如下:
- scrollViewTo(e){
- let target = e.nativeEvent.target;
- let scrollLength = 0;//初始值
- if (target=== ReactNative.findNodeHandle(this.refs.hour)) {
- scrollLength = 216;
- }
- this.refs.scroll.scrollTo({y:scrollLength,x:0});
需要注意的点:1、滚动的高度需要根据你的使用场景确认
2、最好由Native给RN动态的计算出虚拟键盘的高度
好了,用上述方案,基本可以解决虚拟键盘覆盖表单的问题。
还有其他的解决方案可参考(没有经过验证):
https://github.com/reactnativecn/react-native-inputscrollview
https://github.com/wix/react-native-keyboard-aware-scrollview
如果你有更好的方案,欢迎留言交流。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。