UICollectionView中的单边方向滚动?

时间:2017-02-28 06:31:39

标签: ios objective-c iphone swift

我试图让UICollectionView完全垂直或完全水平滚动,具体取决于滑动/平移的方向。

不应该有对角线滚动。

如果用户在对角线方向上滑动,则应选择较强的方向(垂直或水平方向),然后仅向该方向滚动。

网络上的其他答案与使用CollectionViewFlowLayout相关,后者允许单一方向。但是,我必须继承UICollectionViewLayout以便允许水平和垂直滚动。

现在,我想禁用对角线滚动,但保持水平/垂直滚动的能力。

我已经使用了collectionView.isDirectionLockEnabled,但根据apple Docs:

  

如果此属性为true且用户开始沿一个大致方向(水平或垂直)拖动,则滚动视图将禁用向另一个方向滚动。如果拖动方向是对角线,则滚动不会被锁定,用户可以向任何方向拖动,直到拖动完成。

它仍然允许对角滚动,因此对我期望的目标没有太大帮助。

我正在寻找某种覆盖点,我可以捕捉拖动/滚动的方向,然后只允许滚动某个方向。

编辑: 这是我的相关代码。这段代码使得对角滚动变得更加困难,但有时,我仍然能够对角滚动:

var initialContentOffset: CGPoint = CGPoint.zero

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    initialContentOffset = scrollView.contentOffset
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.isDragging {
        let velocity = scrollView.panGestureRecognizer.velocity(in: scrollView)

        if abs(velocity.y) > abs(velocity.x) {
            scrollView.contentOffset = CGPoint(x: initialContentOffset.x, y: scrollView.contentOffset.y)
        } else if abs(velocity.x) > abs(velocity.y) {
            scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: initialContentOffset.y)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您应该结合检查delegates的多个scrollViewCheck direction of scroll in UIScrollView

1:您需要保留一个布尔属性isScrolling,以了解scrollView is scrolling or if it has stopped可能属性保持用户当前滚动方向的参考如果 (isScrolling == YES)

2:现在使用此方法:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

我们需要检查what direction the user will scroll,同时您可以对第一个标记isScrolling进行检查:

  • 如果scrollView 已停止滚动,则允许滚动开始并将isScrolling标记设置为YES { {3}}
  • 如果scrollView尚未停止滚动,您只需设置scrollView.contentOffset xy,具体取决于您希望滚动浏览器保持滚动的方向。