mirror of
https://github.com/status-im/react-native.git
synced 2025-02-25 23:55:23 +00:00
Fix ScrollView's snap index when scrolling forward and user taps the screen again while still scrolling
Summary: Currently when snapping is used with ScrollView it calculates wrong snap index if user taps the screen second time while ScrollView is still scrolling. This happens because the code only adds 1 to the snap index when translationAlongAxis is smaller than zero. When user taps screen second time the translationAlongAxis is 0 and snap index ends up being one less than it should. This causes the ScrollView to scroll one step backwards. Bug can be reproduced with the new examples I added to UIExplorer's ScrollView in [scrollview-snap-bug-example branch](https://github.com/anttimo/react-native/tree/scrollview-snap-bug-example). Fix can be verified by running the same examples with the ScrollView fix in [scrollview-snap-bug-example-with-fix branch](https://github.com/anttimo/react-native/tree/scrollview-snap-bug-example-with-fix). init)
|
||||
uint16_t _coalescingKey;
|
||||
NSString *_lastEmittedEventName;
|
||||
NSHashTable *_scrollListeners;
|
||||
// The last non-zero value of translationAlongAxis from scrollViewWillEndDragging.
|
||||
// Tells if user was scrolling forward or backward and is used to determine a correct
|
||||
// snap index when the user stops scrolling with a tap on the scroll view.
|
||||
CGFloat _lastNonZeroTranslationAlongAxis;
|
||||
}
|
||||
|
||||
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher
|
||||
@ -699,7 +703,14 @@ RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, onScroll)
|
||||
|
||||
// Pick snap point based on direction and proximity
|
||||
NSInteger snapIndex = floor((targetContentOffsetAlongAxis + alignmentOffset) / snapToIntervalF);
|
||||
snapIndex = (translationAlongAxis < 0) ? snapIndex + 1 : snapIndex;
|
||||
BOOL isScrollingForward = translationAlongAxis < 0;
|
||||
BOOL wasScrollingForward = translationAlongAxis == 0 && _lastNonZeroTranslationAlongAxis < 0;
|
||||
if (isScrollingForward || wasScrollingForward) {
|
||||
snapIndex = snapIndex + 1;
|
||||
}
|
||||
if (translationAlongAxis != 0) {
|
||||
_lastNonZeroTranslationAlongAxis = translationAlongAxis;
|
||||
}
|
||||
CGFloat newTargetContentOffset = ( snapIndex * snapToIntervalF ) - alignmentOffset;
|
||||
|
||||
// Set new targetContentOffset
|
||||
|
Loading…
x
Reference in New Issue
Block a user