diff --git a/submodules/Display/Source/ListView.swift b/submodules/Display/Source/ListView.swift index 0f2d2b3894..b23f716edb 100644 --- a/submodules/Display/Source/ListView.swift +++ b/submodules/Display/Source/ListView.swift @@ -67,6 +67,7 @@ public final class ListViewBackingView: UIView { override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { if !self.isHidden, let target = self.target { if target.bounds.contains(point) { + target.scroller.forceDecelerating = false if target.decelerationAnimator != nil { target.decelerationAnimator?.isPaused = true target.decelerationAnimator = nil @@ -854,6 +855,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture self.decelerationAnimator?.isPaused = true let startTime = CACurrentMediaTime() let decelerationRate: CGFloat = 0.998 + self.scroller.forceDecelerating = true self.decelerationAnimator = ConstantDisplayLinkAnimator(update: { [weak self] in guard let strongSelf = self else { return @@ -879,6 +881,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture } if abs(currentVelocity) < 0.1 { + strongSelf.scroller.forceDecelerating = false strongSelf.decelerationAnimator?.isPaused = true strongSelf.decelerationAnimator = nil } diff --git a/submodules/Display/Source/ListViewScroller.swift b/submodules/Display/Source/ListViewScroller.swift index 5052231153..143444d07f 100644 --- a/submodules/Display/Source/ListViewScroller.swift +++ b/submodules/Display/Source/ListViewScroller.swift @@ -42,4 +42,9 @@ public final class ListViewScroller: UIScrollView, UIGestureRecognizerDelegate { override public func touchesShouldCancel(in view: UIView) -> Bool { return true } + + var forceDecelerating = false + public override var isDecelerating: Bool { + return self.forceDecelerating || super.isDecelerating + } } diff --git a/submodules/SparseItemGrid/Sources/SparseItemGrid.swift b/submodules/SparseItemGrid/Sources/SparseItemGrid.swift index 0623f9b134..e5d908896b 100644 --- a/submodules/SparseItemGrid/Sources/SparseItemGrid.swift +++ b/submodules/SparseItemGrid/Sources/SparseItemGrid.swift @@ -437,8 +437,16 @@ public final class SparseItemGrid: ASDisplayNode { } let zoomLevel: ZoomLevel + + class ScrollView: UIScrollView { + var forceDecelerating = false + + override var isDecelerating: Bool { + return self.forceDecelerating || super.isDecelerating + } + } - let scrollView: UIScrollView + let scrollView: ScrollView private let shimmer: Shimmer var theme: PresentationTheme @@ -468,7 +476,7 @@ public final class SparseItemGrid: ASDisplayNode { self.maybeLoadHoleAnchor = maybeLoadHoleAnchor self.coveringOffsetUpdated = coveringOffsetUpdated - self.scrollView = UIScrollView() + self.scrollView = ScrollView() if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { self.scrollView.contentInsetAdjustmentBehavior = .never } @@ -502,6 +510,7 @@ public final class SparseItemGrid: ASDisplayNode { @objc func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { self.items?.itemBinding.didScroll() if let decelerationAnimator = self.decelerationAnimator { + self.scrollView.forceDecelerating = false self.decelerationAnimator = nil decelerationAnimator.invalidate() } @@ -803,6 +812,7 @@ public final class SparseItemGrid: ASDisplayNode { let startTime = CACurrentMediaTime() var currentOffset = self.scrollView.contentOffset let decelerationRate: CGFloat = 0.998 + self.scrollView.forceDecelerating = true self.scrollViewDidEndDragging(self.scrollView, willDecelerate: true) self.decelerationAnimator = ConstantDisplayLinkAnimator(update: { [weak self] in guard let strongSelf = self else { @@ -833,6 +843,7 @@ public final class SparseItemGrid: ASDisplayNode { strongSelf.scrollViewDidScroll(strongSelf.scrollView) if didEnd { strongSelf.scrollViewDidEndDecelerating(strongSelf.scrollView) + strongSelf.scrollView.forceDecelerating = false } }) self.decelerationAnimator?.isPaused = false @@ -1045,6 +1056,7 @@ public final class SparseItemGrid: ASDisplayNode { return nil } if let decelerationAnimator = strongSelf.decelerationAnimator { + strongSelf.scrollView.forceDecelerating = false strongSelf.decelerationAnimator = nil decelerationAnimator.invalidate() }