Fix scroll views not ignoring content touches for transferred deceleration

This commit is contained in:
Ilya Laktyushin 2023-01-11 19:59:55 +04:00
parent 1910062888
commit 09980ea42b
3 changed files with 22 additions and 2 deletions

View File

@ -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
}

View File

@ -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
}
}

View File

@ -438,7 +438,15 @@ public final class SparseItemGrid: ASDisplayNode {
let zoomLevel: ZoomLevel
let scrollView: UIScrollView
class ScrollView: UIScrollView {
var forceDecelerating = false
override var isDecelerating: Bool {
return self.forceDecelerating || super.isDecelerating
}
}
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()
}