1. 程式人生 > >React-Native鍵盤遮擋問題進階發現

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,

ReactNativereact-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