《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。

   <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


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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值