最近在項目中,使用TextInput組件的時候,發(fā)現(xiàn)鍵盤彈出的時候,遮蓋了表單。
在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的滾動。
滾動函數(shù)如下:
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、滾動的高度需要根據(jù)你的使用場景確認
2、最好由Native給RN動態(tài)的計算出虛擬鍵盤的高度
好了,用上述方案,基本可以解決虛擬鍵盤覆蓋表單的問題。