打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《React-Native系列》33、 键盘遮挡问题处理

最近在项目中,使用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。

[javascript] view plain copy
  1.  <ScrollView ref='scroll' keyboardShouldPersistTaps={true} >  
  2.    <View onStartShouldSetResponderCapture={(e) => {  
  3. let target = e.nativeEvent.target;  
  4. if (target !== ReactNative.findNodeHandle(this.refs.hour) ) {  
  5.     this.refs.hour.blur();  
  6. }  
  7.    }}>  
  8.    </View>  
  9.  </ScrollView>  

View里的TextInput的代码如下:

[javascript] view plain copy
  1. <TextInput  
  2.   style={styles.ksValueView}  
  3.   maxLength={2}  
  4.   placeholder="0"  
  5.   placeholderTextColor="#b2b2b2"  
  6.   multiline={false}  
  7.   onChangeText={this.changeHour.bind(this)}  
  8.   keyboardType="numeric"  
  9.   ref = 'hour'  
  10.   onFocus={this.scrollViewTo.bind(this)}  
  11.   onEndEditing={()=>{this.refs.scroll.scrollTo({y:0,x:0,animated:true})}}  
  12.   />  

onFocus方法中滚动scrollview,在onEndEditing中恢复scrollview的滚动。


滚动函数如下:
[javascript] view plain copy
  1. scrollViewTo(e){  
  2. let target = e.nativeEvent.target;  
  3. let scrollLength = 0;//初始值  
  4. if (target=== ReactNative.findNodeHandle(this.refs.hour)) {  
  5.   scrollLength = 216;  
  6. }  
  7. 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


如果你有更好的方案,欢迎留言交流。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
FB开源React Native,用JS开发原生iOS应用
React Native ref高级用法&&setNativeProps使用
react-native 键盘遮挡输入框
梅花雨的日历控件在ASP.NET2.0下不可用的解决方法
Flutter中焦点控制FocusNode、Flutter输入框焦点事件的捕捉与监听
如何实现当鼠标点击输入框时,输入框内的提示文字自动消失
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服