2016-05-09 13 views

答えて

1

あなたはタッチイベントを直接聞くためにReactNativeEventEmitterを使用し、ジェスチャーレスポンダーのものを完全にバイパスする必要があります。以下は、これらのタッチイベントが受信されるたびにラップされたクラスのonTouchStart,onTouchEndおよびonTouchMoveを呼び出すデコレータクラスです。

'use strict'; 

import React, {Component} from 'react-native'; 
import ReactNativeEventEmitter from 'ReactNativeEventEmitter'; 
import NodeHandle from 'NodeHandle'; 

export const multitouchable = BaseComponent => { 
    return class extends Component { 

     constructor(props, context) { 
      super(props, context); 

      this.comp = null; 
      this.compId = null; 
     } 

     componentDidMount() { 
      if(this.comp && this.compId){ 
       this.comp.onTouchStart && ReactNativeEventEmitter.putListener(this.compId, 'onTouchStart', e => this.comp.onTouchStart(e)); 
       this.comp.onTouchEnd && ReactNativeEventEmitter.putListener(this.compId, 'onTouchEnd', e => this.comp.onTouchEnd(e)); 
       this.comp.onTouchMove && ReactNativeEventEmitter.putListener(this.compId, 'onTouchMove', e => this.comp.onTouchMove(e)); 
      } 
     } 

     componentWillUnmount() { 
      if(this.comp && this.compId){ 
       this.comp.onTouchStart && ReactNativeEventEmitter.deleteListener(this.compId, 'onTouchStart'); 
       this.comp.onTouchEnd && ReactNativeEventEmitter.deleteListener(this.compId, 'onTouchEnd'); 
       this.comp.onTouchMove && ReactNativeEventEmitter.deleteListener(this.compId, 'onTouchMove'); 
      } 
     } 

     render() { 
      return (
       <BaseComponent {...this.props} {...this.state} 
        ref={c => { 
         this.comp = c; 
         const handle = React.findNodeHandle(c); 
         if(handle) 
          this.compId = NodeHandle.getRootNodeID(handle); 
        }} 
       /> 
      ); 
     } 
    }; 
} 
+2

これは間違いなく私を助けましたが、反応したネイティブの最新バージョンではあなたのために働いていますか? (0.27)NodeHandleがもう存在しないように見えますが、findNodeHandleに置き換えられましたが、ReactNativeEventEmitter.putListenerメソッドの最初のパラメータとして期待されるオブジェクトの代わりに整数を返します。ただし、_rootNodeIDキーでオブジェクトを作成し、putListenerに渡すことができます。それは私のために働いた。 – OndrejRohon

関連する問題