我正在使用React Native .61。
我正在尝试使用使用Pan Responder的库,但它无法正常工作。
这是我的代码:
<Swiper
ref={this.swiper}
onSwiped={(cardIndex) => this.onSwiped('general', cardIndex)}
onSwipedLeft={(cardIndex) => this.onSwiped('left', cardIndex)}
onSwipedRight={(cardIndex) => this.onSwiped('right', cardIndex)}
cards={this.state.offers}
cardIndex={this.state.cardIndex}
cardVerticalMargin={20}
infinite={true}
disableTopSwipe={true}
disableBottomSwipe={true}
renderCard={this.renderCard}
onSwipedAll={this.onSwipedAllCards}
stackSize={3}
stackSeparation={15}
overlayLabels={{
left: {
title: 'NOPE',
style: {
label: {
backgroundColor: 'black',
borderColor: 'black',
color: 'white',
borderWidth: 1
},
wrapper: {
flexDirection: 'column',
alignItems: 'flex-end',
justifyContent: 'flex-start',
marginTop: 30,
marginLeft: -30
}
}
},
right: {
title: 'LIKE',
style: {
label: {
backgroundColor: 'black',
borderColor: 'black',
color: 'white',
borderWidth: 1
},
wrapper: {
flexDirection: 'column',
alignItems: 'flex-start',
justifyContent: 'flex-start',
marginTop: 30,
marginLeft: 30
}
}
},
}}
animateOverlayLabelsOpacity
animateCardOpacity
swipeBackCard
>
</Swiper>
<Buttons onSwiped={this.onSwiped} {...this.props} swiper={this.swiper} />
这是模块内部的平移响应器用法:
initializePanResponder = () => {
this._panResponder = PanResponder.create({
onStartShouldSetPanResponder: (event, gestureState) => true,
onMoveShouldSetPanResponder: (event, gestureState) => true,
onMoveShouldSetPanResponderCapture: (evt, gestureState) => {
const isVerticalSwipe = Math.sqrt(
Math.pow(gestureState.dx, 2) < Math.pow(gestureState.dy, 2)
)
if (!this.props.verticalSwipe && isVerticalSwipe) {
return false
}
return Math.sqrt(Math.pow(gestureState.dx, 2) + Math.pow(gestureState.dy, 2)) > 10
},
onPanResponderGrant: this.onPanResponderGrant,
onPanResponderMove: this.onPanResponderMove,
onPanResponderRelease: this.onPanResponderRelease,
onPanResponderTerminate: this.onPanResponderRelease
})
}
onPanResponderGrant = (event, gestureState) => {
this.props.dragStart && this.props.dragStart()
if (!this.state.panResponderLocked) {
this.state.pan.setOffset({
x: this._animatedValueX,
y: this._animatedValueY
})
}
this.state.pan.setValue({
x: 0,
y: 0
})
}
onPanResponderMove = (event, gestureState) => {
this.props.onSwiping(this._animatedValueX, this._animatedValueY)
let { overlayOpacityHorizontalThreshold, overlayOpacityVerticalThreshold } = this.props
if (!overlayOpacityHorizontalThreshold) {
overlayOpacityHorizontalThreshold = this.props.horizontalThreshold
}
if (!overlayOpacityVerticalThreshold) {
overlayOpacityVerticalThreshold = this.props.verticalThreshold
}
let isSwipingLeft,
isSwipingRight,
isSwipingTop,
isSwipingBottom
if (Math.abs(this._animatedValueX) > Math.abs(this._animatedValueY) && Math.abs(this._animatedValueX) > overlayOpacityHorizontalThreshold) {
if (this._animatedValueX > 0) isSwipingRight = true
else isSwipingLeft = true
} else if (Math.abs(this._animatedValueY) > Math.abs(this._animatedValueX) && Math.abs(this._animatedValueY) > overlayOpacityVerticalThreshold) {
if (this._animatedValueY > 0) isSwipingBottom = true
else isSwipingTop = true
}
if (isSwipingRight) {
this.setState({ labelType: LABEL_TYPES.RIGHT })
} else if (isSwipingLeft) {
this.setState({ labelType: LABEL_TYPES.LEFT })
} else if (isSwipingTop) {
this.setState({ labelType: LABEL_TYPES.TOP })
} else if (isSwipingBottom) {
this.setState({ labelType: LABEL_TYPES.BOTTOM })
} else {
this.setState({ labelType: LABEL_TYPES.NONE })
}
const { onTapCardDeadZone } = this.props
if (
this._animatedValueX < -onTapCardDeadZone ||
this._animatedValueX > onTapCardDeadZone ||
this._animatedValueY < -onTapCardDeadZone ||
this._animatedValueY > onTapCardDeadZone
) {
this.setState({
slideGesture: true
})
}
return Animated.event([null, this.createAnimatedEvent()])(
event,
gestureState
)
}
onPanResponderRelease = (e, gestureState) => {
this.props.dragEnd && this.props.dragEnd()
if (this.state.panResponderLocked) {
this.state.pan.setValue({
x: 0,
y: 0
})
this.state.pan.setOffset({
x: 0,
y: 0
})
return
}
const { horizontalThreshold, verticalThreshold } = this.props
const animatedValueX = Math.abs(this._animatedValueX)
const animatedValueY = Math.abs(this._animatedValueY)
const isSwiping =
animatedValueX > horizontalThreshold || animatedValueY > verticalThreshold
if (isSwiping && this.validPanResponderRelease()) {
const onSwipeDirectionCallback = this.getOnSwipeDirectionCallback(
this._animatedValueX,
this._animatedValueY
)
this.swipeCard(onSwipeDirectionCallback)
} else {
this.resetTopCard()
}
if (!this.state.slideGesture) {
this.props.onTapCard(this.state.firstCardIndex)
}
this.setState({
labelType: LABEL_TYPES.NONE,
slideGesture: false
})
}
我一直试图解决这一问题-由于某种原因,该库在Android上无法正常工作。
我已经考虑过将其换成另一个,或者自己编写,但是我已经可以使用我的iOS代码了,我不愿完全替换它,尤其是当我猜测这是一个相当简单的Pan Responder问题时
有问题的图书馆是这个图书馆:
答案 0 :(得分:0)
我需要将<View style={{flex: 1}}>
应用于所有父视图。
如果未将任何视图设置为flex:1,则此插件将无法工作。