我试图让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)
}
}
}
答案 0 :(得分:1)
您应该结合检查delegates
的多个scrollView
。
Check 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
x
或y
,具体取决于您希望滚动浏览器保持滚动的方向。