React Native - panResponder 动画在 iOS 上不起作用

Posted

技术标签:

【中文标题】React Native - panResponder 动画在 iOS 上不起作用【英文标题】:React Native - panResponder animation not working on iOS 【发布时间】:2019-08-11 00:45:29 【问题描述】:

我使用 panResponder 在我的应用程序中创建可拖动视图。它在 android 上运行良好,但在 ios 上,拖动动画在移动一点后停止。

Vidéo here 这是我的代码:

export default class Draggable extends React.Component 

constructor(props) 
  super(props);

  const  pressDragRelease, pressDragStart, reverse, initPosition  = props;

this.state = 
  pan: new Animated.ValueXY(
    x: initPosition.dragX,
    y: initPosition.dragY
  ),
  _value:  x: initPosition.dragX, y: initPosition.dragY 
;

this.panResponder = PanResponder.create(
  onStartShouldSetPanResponder: (evt, gestureState) => true,
  onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
  onMoveShouldSetPanResponder: (evt, gestureState) => true,
  onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
  onPanResponderGrant: (gesture) => 
    console.log("inside panResponder grant");
    if (reverse === false) 
      this.state.pan.setOffset(x: this.state._value.x,y: this.state._value.y);
      this.state.pan.setValue( x: 0, y: 0 );
     else 
      this.state.pan.setValue( x: gesture.dx, y: gesture.dy );
    
  ,
  onPanResponderMove: Animated.event([
      null,
      
        dx: this.state.pan.x,
        dy: this.state.pan.y
      
    ]),
    //Called on android at the end
    onPanResponderRelease: () => 
      if (pressDragRelease) 
        pressDragRelease( x: this.state._value.x, y: this.state._value.y );
      

    if (reverse === false) this.state.pan.flattenOffset();
    else this.reversePosition();

  ,
  //Called on ios at the end
  onPanResponderTerminate: () => 

    if (pressDragRelease) 
      pressDragRelease( x: this.state._value.x, y: this.state._value.y 
   );
    

    if(reverse === false) 
      this.state.pan.flattenOffset();
     else 
      this.reversePosition();
    

  
);


componentWillMount() 
 if (this.props.reverse === false)
   this.state.pan.addListener(c => this.setState( _value: c ));


componentWillUnmount() 
  this.state.pan.removeAllListeners();


reversePosition = () => 
  const  initPosition  = this.props;
  Animated.spring(this.state.pan, 
    toValue:  x: initPosition.dragX, y: initPosition.dragY 
  ).start();
;

render() 
  return (
    <Animated.View
      ...this.panResponder.panHandlers
      style=[this.state.pan.getLayout()]
    >
      this.props.children
    </Animated.View>
   );
  

我正在使用: “反应原生”:“0.57.7”

我尝试了很多与 panResponder 相关的东西,因为它在 android 上运行良好我来宾这是处理程序或 onPanResponderMove 处理程序中的 Animated.event 的问题?

感谢您的帮助,我为此苦苦挣扎了好几天! :)

【问题讨论】:

您是否已经轻松使用过动画计时?Easing.linear? 我只是尝试了一些带有“Animated.timing”的动画,效果很好。 【参考方案1】:

也遇到了这个问题。 删除了我的节点模块和 pod 并重新安装它能够解决它。

我知道过去反应导航有冲突。 https://github.com/react-navigation/react-navigation/issues/5497

实际上在使用使用 panResponder 构建的滑块库时遇到了这个问题。

【讨论】:

以上是关于React Native - panResponder 动画在 iOS 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

仅当我移动手指时才允许Panresponder React native

React Native - PanResponder - 捕获冒泡机制详解

React Native - panResponder 动画在 iOS 上不起作用

如何在 React Native 中制作微调器?我想通过 PanResponder 旋转框

PanResponder 中的 ScrollView

react native 实现拖动view (完善边界处理)