禁用 UIScrollView 惯性 (scrollViewDidEndDecelerating) Swift

Disable UIScrollView inertia (scrollViewDidEndDecelerating) Swift

设置: 我有一个滚动视图,它在水平方向上效果很好,还有一个 UISwipeGestureRecognizer,当我向下滑动时,它会触发切换到另一个视图。

问题:如果我水平滚动并开始向下滑动(禁用垂直滚动)当滚动减速时,向下滑动动作 (segue) 不执行。只有在滚动减速完成后才有效。

有没有办法禁用滚动减速(又名惯性),以便可以立即检测到我的向下滑动手势?也许有一种解决方法可以强制首先检测到 UISwipeGestureRecognizer?

非常感谢 Swift 中的解决方案!

你看过这里吗? Deactivate UIScrollView decelerating

答案

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{  
[scrollView setContentOffset:scrollView.contentOffset animated:YES];   
}

转换为swift是

func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
scrollView.setContentOffset(scrollView.contentOffset, animated: true)
}

Swift 3:

要禁用减速滚动,您可以尝试:

func scrollViewWillEndDragging (scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    targetContentOffset.memory = scrollView.contentOffset
}

或者您更改此值:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal
// UIScrollViewDecelerationRateFast is the other param

关于你的gestureRecognizer interferences你可以调用这个方法来排除触摸:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    // insert here views to exclude from gesture
    if touch.view!.isDescendantOfView(self.excludeThisView) {
        return false
    }
    return true
}

UIScrollView 有一个 pinchGestureRecognizer 和一个 panGestureRecognizer。如果你有一个 UISwipeGestureRecognizer,手势很可能会被识别为 UIPanGestureRecognizer
可以添加一个依赖来解决问题:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(swipeGesture)