反应本机 panResponder onRelease 事件窃取可触摸的不透明度 onpress 事件
React native panResponder onRelease event stealing touchable opacity onpress event
似乎反应本机 panResponder onRelease 事件正在窃取可触摸的不透明度 onpress 事件。
可触摸不透明度的 onpressin 和 onpressout 事件仍然正确触发,但 onpress 事件仅在 pan 响应器上的 onrelease 事件未触发时触发(此问题仅发生在 ios,它在android)。
可触摸不透明度的文档说,如果响应者窃取触摸,则不会调用 onpress,但我无法弄清楚如何让它停止窃取简单按下的触摸。
这是我的代码的简化版本:
const panResponder = useMemo(() => {
return PanResponder.create({
onMoveShouldSetPanResponder: () => true,
onPanResponderGrant: (evt, gestureState) => {
dostuff()
},
onPanResponderMove: (evt, gestureState) => {
dostuff()
},
onPanResponderRelease: (evt, gestureState) => {
dostuff()
},
onShouldBlockNativeResponder: () => {
return true;
},
return (
<View {...panResponder.panHandlers} style={[styles.view, style]}>
<Button
onPress={() => {
//not logging
console.log('Onpress firing")}
} onPressIn={() => {
//getting logged
console.log('Onpressin firing')
}} onPressOut={() => {
//getting logged
console.log('Onpressout firing')
}}
/>
</View>
);
似乎在 iOS onMoveShouldSetResponder
上被调用的边距比在 Android 上更小,导致即使您的手指移动少量也能被调用。我通过这样做设法修复了它。
onMoveShouldSetPanResponder: (evt, {dx, dy}) => {
if (dx > 0 || dy > 0) {
return true;
}
return false;
},
似乎反应本机 panResponder onRelease 事件正在窃取可触摸的不透明度 onpress 事件。
可触摸不透明度的 onpressin 和 onpressout 事件仍然正确触发,但 onpress 事件仅在 pan 响应器上的 onrelease 事件未触发时触发(此问题仅发生在 ios,它在android)。 可触摸不透明度的文档说,如果响应者窃取触摸,则不会调用 onpress,但我无法弄清楚如何让它停止窃取简单按下的触摸。
这是我的代码的简化版本:
const panResponder = useMemo(() => {
return PanResponder.create({
onMoveShouldSetPanResponder: () => true,
onPanResponderGrant: (evt, gestureState) => {
dostuff()
},
onPanResponderMove: (evt, gestureState) => {
dostuff()
},
onPanResponderRelease: (evt, gestureState) => {
dostuff()
},
onShouldBlockNativeResponder: () => {
return true;
},
return (
<View {...panResponder.panHandlers} style={[styles.view, style]}>
<Button
onPress={() => {
//not logging
console.log('Onpress firing")}
} onPressIn={() => {
//getting logged
console.log('Onpressin firing')
}} onPressOut={() => {
//getting logged
console.log('Onpressout firing')
}}
/>
</View>
);
似乎在 iOS onMoveShouldSetResponder
上被调用的边距比在 Android 上更小,导致即使您的手指移动少量也能被调用。我通过这样做设法修复了它。
onMoveShouldSetPanResponder: (evt, {dx, dy}) => {
if (dx > 0 || dy > 0) {
return true;
}
return false;
},