简体   繁体   English

如何在子组件上禁用PanResponder-React Native

[英]How To Disable PanResponder on Child Component - React Native

Friend I will take oneView of Parents and Inside the View I take one TouchableOpacity. 朋友,我将采用一个“父母视图”,而在视图内部则采用一个“ TouchableOpacity”。 I Will Added panResponder on main View, And when touch of main view its working fine. 我将在主视图上添加panResponder,当触摸主视图时,它可以正常工作。 But TouchableOpacity is not working, I want to remove panResponder on TouchableOpacity. 但是TouchableOpacity无法正常工作,我想删除TouchableOpacity上的panResponder。 So that TouchableOpacity is work. 这样TouchableOpacity就可以了。

Code : 代码:

    this._panResponder = PanResponder.create({
      // Ask to be the responder:
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => true,
      onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,


      onPanResponderGrant: (evt, gestureState) => {
        // The gesture has started. Show visual feedback so the user knows
        // what is happening!

        // gestureState.d{x,y} will be set to zero now

        // this.toggleModal()
      },
      onPanResponderMove: (evt, gestureState) => {
        // The most recent move distance is gestureState.move{X,Y}

        // The accumulated gesture distance since becoming responder is
        // gestureState.d{x,y}
        console.log('onPanResponderMove');
      },
      onPanResponderTerminationRequest: (evt, gestureState) => true,
      onPanResponderRelease: (evt, gestureState) => {
        // The user has released all touches while this view is the
        // responder. This typically means a gesture has succeeded
        console.log('onPanResponderRelease');

        this.toggleModal()
      },
      onPanResponderTerminate: (evt, gestureState) => {
        // Another component has become the responder, so this gesture
        // should be cancelled

        console.log('onPanResponderTerminate');

      },
      onShouldBlockNativeResponder: (evt, gestureState) => {
        // Returns whether this component should block native components from becoming the JS
        // responder. Returns true by default. Is currently only supported on android.

        console.log('onShouldBlockNativeResponder');

        return true;
      },
    });
 }

Pan added on Parents View : 将Pan添加到Parents View上:

render() {
    return (
      <View {...this._panResponder.panHandlers}>
        <TouchableOpacity onPress={this._onPressButton}>
         <Image
          style={styles.button}
          source={require('./myButton.png')}
         />
       </TouchableOpacity>
      </View>
    );
  },

The Button OnPress event isn't working when adding Pan on mainView. 在mainView上添加Pan时,Button OnPress事件不起作用。

Change this line then inner Touchables will get the event. 更改此行,则内部Touchables将获得事件。

when returning true, it will prevent child from become responder. 返回true时,将防止孩子成为响应者。

  onStartShouldSetPanResponderCapture: (evt, gestureState) => false,

From document : 来自文件

So if a parent View wants to prevent the child from becoming responder on a touch start, it should have a onStartShouldSetResponderCapture handler which returns true. 因此,如果父View希望防止孩子在触摸开始时成为响应者,则应具有onStartShouldSetResponderCapture处理函数,该处理函数返回true。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM