React-Native鍵盤遮擋問題進階發現
我在前面也寫了一篇關於鍵盤遮擋問題的解決方案,這次的原理也差不多,不過在後續的研究中發現官方給了一個有意思的元件叫 KeyboardAvoidingView。然後就動手去試了一試,然而效果並不好!具體用法可以參考這裡:點選開啟連結
不過隨著RN的更新,這個官網肯定會解決的,但是在官方還沒填坑前,還是得自己動手解決啦。
我前面部落格的處理方法:點選開啟連結
其實原理是要獲取到鍵盤的高度和輸入框的位置,然後去計算偏移位置就可以了。
那麼今天這篇是寫什麼呢?
我前面的方法主要是自己寫了原生的程式碼,然後獲取鍵盤寬高,但是我今天才知道,原來RN的Keyboard元件已經有這個了,所以可以把之前方法中的原生部分可以剪掉了,畢竟還是官方的靠譜呀~
然後,今天的第二個發現就是RN中獲取一個元件在螢幕的位置,這個以前我不知道,是通過元件和父元件的位置,去計算元件在螢幕的位置,這個的麻煩就是層次越深,越不好計算,你要傳的資料就太多了,導致計算繁瑣,不好得到正確的位置。今天我就告訴大家一個好方法,也是RN自帶的叫measure。每個view都有這個屬性,它裡面就有6個引數,分別為ox,oy,width,height,px,py。這裡的px,py就是元件在螢幕的位置啦!真是太棒啦~~
於是,我根據這些新發現,寫了一個元件,在需要用的TextInput元件下面直接使用,就可以啦!直接貼程式碼好了:
import React, { Component, PropTypes} from 'react'; import { StyleSheet, View, Keyboard, LayoutAnimation } from 'react-native'; export default class InputBoard extends Component { constructor(props) { super(props); this.state={ marginTop: 0, }; this.keyboardShow = false;//當前鍵盤的狀態,顯示與否 this.baseLayout = null; this.config = { duration: 150, create: { type: LayoutAnimation.Types.easeOut, property: LayoutAnimation.Properties.opacity, }, update: { type: LayoutAnimation.Types.easeInEaseOut, } }; this.basePos = null; } static propTypes = { spaceHeight: PropTypes.number, //固定增加高度 } static defaultProps = { spaceHeight: 0, } componentWillMount() { this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow.bind(this)); this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide.bind(this)); } componentDidMount() { if (this.root){ this.root.measure((ox, oy, width, height, px, py)=>{ this.basePos = { ox: ox, oy: oy, width: width, height: height, px: px, py: py }; console.log(this.basePos); }); } } componentWillUnmount() { this.keyboardDidShowListener.remove(); this.keyboardDidHideListener.remove(); } _keyboardDidShow(e) {//當鍵盤彈起來 this.keyboardShow = true; // let moveY = -(e.startCoordinates.height-this.baseLayout.y-this.baseLayout.height-this.props.spaceHeight); // if (moveY > 0){ // console.log("did show", e, 'move y: ' + moveY); // LayoutAnimation.configureNext(this.config); // this.setState({ // marginTop: moveY // }); // } this.root.measure((ox, oy, width, height, px, py)=>{ if (this.basePos) this.basePos = { ox: ox, oy: oy, width: width, height: height, px: px, py: py }; let moveY = -(e.startCoordinates.height-this.basePos.py-this.props.spaceHeight); if (moveY > 0){ console.log("did show", e, 'move y: ' + moveY); LayoutAnimation.configureNext(this.config); this.setState({ marginTop: moveY }); } }); } _keyboardDidHide(e) {//當鍵盤收起後 this.keyboardShow = false; if (this.state.marginTop != 0){ LayoutAnimation.configureNext(this.config); console.log("did hide", e); this.setState({ marginTop: 0, }); } } onLayout(event){ // if (event.nativeEvent.target == ReactNative.findNodeHandle(this.root)) if (this.baseLayout == null){ this.baseLayout = event.nativeEvent.layout; } } render() { console.log('render board'); return ( <View ref={(r)=>{this.root = r}} style={[styles.container, this.props.style, {marginTop: this.state.marginTop}]} onLayout={this.onLayout.bind(this)} /> ); } } const styles = StyleSheet.create({ container:{ } });
然後使用:
<TextInput style={styles.textInput} />
<InputBoard spaceHeight={44}/>//textInput的高度是44.
注意一點的是,我內部是使用的marginTop,所以在樣式上有一定的要求,不能使用固定的位置,否則計算的位置有誤差,甚至是不動。
如果誰可以給這個進行改良,希望可以發給我~哈哈
相關推薦
React-Native鍵盤遮擋問題進階發現
我在前面也寫了一篇關於鍵盤遮擋問題的解決方案,這次的原理也差不多,不過在後續的研究中發現官方給了一個有意思的元件叫 KeyboardAvoidingView。然後就動手去試了一試,然而效果並不好!具體用法可以參考這裡:點選開啟連結 不過隨著RN的更新,這個官網肯定會解決
react-native flatlist 的進階使用 (頭尾,間隔元件和滾動事件)
0.43之後 RN添加了Flatlist元件,作為ListView的增強版,FlatList有著很強的效能上的優勢,而且使用起來也更簡單。這裡著重介紹一下以下東西:1. 新增頭部元件,2. 新增尾部元
React-native鍵盤遮擋輸入框問題的解決
現在有一個更準確一點的做法是用一個View包裹住TextInput,然後通過該View的onLayout方法獲取該輸入框的y軸位置,再減去一個適當的高度去處理scrollview的滾動,如下所示: <View onLayout={this._downloadLa
react-navigation使用技巧(進階篇)
轉子http://www.jianshu.com/p/b877115fff1b 之前寫過react-navigation使用技巧,那篇文章中主要講了react-navigation的屬性,封裝和一些小技巧。雖然上篇文章中也有一些小技巧,但因為補充的比較晚,導致有些人沒有看全,再加上我又找到了一些新的小玩意,
React中鍵盤遮擋輸入框
很多情況下,我們需要在介面中進行輸入資訊,免不了TextInput元件,但是問題來了,有時候鍵盤彈上來的位置正好遮住了輸入框,使用者根本看不到自己輸入了什麼。 這裡面有一個非常簡單的方法來實現: i
React 從入門到進階之路(七)
之前的文章我們介紹了 React 表單詳解 約束性和非約束性元件 input text checkbox radio select textarea 以及獲取表單的內容。接下來我們將介紹 React中的元件、父子元件、React props父元件給子元件傳值、子元
React 從入門到進階之路(八)
之前的文章我們介紹了 React中的元件、父子元件、React props父元件給子元件傳值、子元件給父元件傳值、父元件中通過refs獲取子元件屬性和方法。接下來我們將介紹 React propTypes defaultProps。 之前我們已經根據
React 從入門到進階之路(九)
之前的文章我們介紹了 React propTypes defaultProps。接下來我們將介紹 React 生命週期函式。 之前我們已經根據 create-react-app 模組建立了一個 React 專案,並定義 App.js 為根元件,即父元件,Home.js 為子元
React Native Android原生方向進階一
雖然說react native的設計初衷是為了敏捷開發,write once,run anywhere,但是還是開放了原生接入這一高階功能,而原生也是一位這個開發方向一個繞不過去的坎,今天先跑了一下流程,總結一下先 1、react-native init mengft_module
React-Native學習之 防止鍵盤遮擋TextInput
import React, {Component} from 'react'; import ReactNative, { AppRegistry, StyleSheet, Text, View, Image, TextInput,
ReactNative進階之react-native-storage的使用及封裝
本篇部落格將帶大家展開reactnative中關於資料持久化儲存的學習。其中涉及到了nodejs的語法的相關知識,也稍做介紹。好了,廢話不多說。在androind中資料的持久化儲存用的比較多的就是shareperferce,通過shareperferce會在手機
React-Native進階_4.底部標籤欄TabBar
原生專案中,我們對底部Tab 很熟悉,點選Tab標籤可以切換頁面,那麼在React-Native 中我們該怎麼實現呢。在查了文件後,我們找到了一個TabBarIos ,這個是ios 下使用的Tab 標籤,但是沒有找到Android 可以使用的,因此 我們需要自己實現,或者使用
React Native 解決 iOS 上鍵盤遮擋 TextInput 問題
我們在用 React Native 開發應用的時候,總會碰到讓使用者輸入某些內容的需求和功能,那麼也總會有當我們的輸入框在螢幕下半部分並且 focus 這個輸入框時,鍵盤彈出並會遮擋在其上,使使用者在輸入時完全不知道自己在輸什麼。 IQKeyboardMana
React Native 解決iOS上鍵盤遮擋TextInput
React Native 鍵盤遮擋TextInput問題的問題 IOS解決方案: IQKeyboardManager, 使用cocoaPods安裝 1. 進入專案的ios資料夾下 2. 新建檔案 Podfile 3. 使用文字編輯器增加以下內容 plat
React-Native解決鍵盤遮擋問題(Keyboard遮擋問題)
在開發中經常遇到需要輸入的地方,RN給我們提過的TextInput雖然好用,可惜並沒有處理遮擋問題。 很多時候鍵盤彈出來都會遮擋住編輯框,讓人很頭疼。 本來想在庫裡面找一找第三方的外掛,看到最好的一個就是react-native-keyboard-spacer了,然而我
React Native未來導航者:react-navigation 使用詳解(進階篇)
剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!
React Native TextInput鍵盤遮擋輸入款問題
當我們使用TextInput輸入框控制元件的時候經常容易被鍵盤所遮擋,在React Native上,安卓不會出現此問題,iOS小螢幕的手機出現比較明顯。 iOS原生開發中可以有代理進行監聽進行上下滾動
《React-Native系列》33、 鍵盤遮擋問題處理
最近在專案中,使用TextInput元件的時候,發現鍵盤彈出的時候,遮蓋了表單。諮詢了下做iOS的同學,他們的處理是計算鍵盤的高度和當前輸入域的位置,將介面向上移動一段距離。那在ReactNative中是否也可以有類似的處理方法呢?答案是肯定的,我們使用ScrollVIew的
react native獲取鍵盤高度
elf ide com nat reac mat height one rem componentWillUnmount() { this.keyboardDidShowListener.remove(); this.keyboardDidHideListene
react-redux進階
react-redux進階一、 安裝: npm install redux react-redux 二、入口文件:index.jsx: 引入: 創建reducer: 創建容器: 將容器綁定到屬性: 完整代碼: var React = require(‘react‘) var ReactDom = re