UIScrollView 滚动时捕捉到位置

问题描述 投票:0回答:2

我正在尝试实现一个滚动视图,在滚动时捕捉到点。

我在这里看到的所有帖子都是关于在用户结束拖动滚动条“之后”捕捉到某个点的。 我想让它在拖动过程中对齐。

到目前为止,我已经用它来停止拖动后的惯性,并且效果很好:

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

我尝试过这个,但没有按预期工作:

var scrollSnapHeight : CGFloat = myScrollView.contentSize.height/10

scrollViewDidScroll:

func scrollViewDidScroll(scrollView: UIScrollView) { let remainder : CGFloat = scrollView.contentOffset.y % scrollSnapHeight var scrollPoint : CGPoint = scrollView.contentOffset if remainder != 0 && scrollView.dragging { if self.lastOffset > scrollView.contentOffset.y //Scrolling Down { scrollPoint.y += (scrollSnapHeight - remainder) NSLog("scrollDown") } else //Scrolling Up { scrollPoint.y -= (scrollSnapHeight - remainder) } scrollView .setContentOffset(scrollPoint, animated: true) } self.lastOffset = scrollView.contentOffset.y; }
    
ios swift pagination uiscrollview scroll-snap-points
2个回答
7
投票
此方法将启用/禁用

scrollEnabled

UIScrollView
 属性。

当scrollView滚动到给定的

scrollSnapHeight

之外时,使
scrollEnabled
变为
false
。这将停止滚动。然后再次启用滚动以进行下一次拖动。

extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(scrollView: UIScrollView) { if scrollView.contentOffset.y > lastOffset + scrollSnapHeight { scrollView.scrollEnabled = false } else if scrollView.contentOffset.y < lastOffset - scrollSnapHeight { scrollView.scrollEnabled = false } } func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { guard !decelerate else { return } setContentOffset(scrollView) } func scrollViewWillBeginDecelerating(scrollView: UIScrollView) { setContentOffset(scrollView) } }


func setContentOffset(scrollView: UIScrollView) { let stopOver = scrollSnapHeight var y = round(scrollView.contentOffset.y / stopOver) * stopOver y = max(0, min(y, scrollView.contentSize.height - scrollView.frame.height)) lastOffset = y scrollView.setContentOffset(CGPointMake(scrollView.contentOffset.x, y), animated: true) scrollView.scrollEnabled = true }
    

4
投票
UIScrollView/UICollectionView 的子类

此解决方案不需要您抬起手指即可松开,并且可以在滚动时工作。如果您需要垂直滚动而不是水平滚动,只需将 x 与 y 交换即可。

snapPoint 设置为您想要捕捉中心所在的内容偏移量。

snapOffset 设置为您想要在 snapPoint 周围发生捕捉的半径。

如果您需要知道scrollView是否已对齐,只需检查

isSnapped变量即可。

class UIScrollViewSnapping : UIScrollView { public var snapPoint: CGPoint? public var snapOffset: CGFloat? public var isSnapped = false public override var contentOffset: CGPoint { set { if let snapPoint = self.snapPoint, let snapOffset = self.snapOffset, newValue.x > snapPoint.x - snapOffset, newValue.x < snapPoint.x + snapOffset { self.isSnapped = true super.contentOffset = snapPoint } else { self.isSnapped = false super.contentOffset = newValue } } get { return super.contentOffset } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.