UIScrollView一次只能向一个方向滚动

我有一个UIScrollView,我希望它能够在两个方向滚动(目前是),但一次只能滚动一个。 所以,例如,如果你开始水平滚动,它将不会垂直移动,直到你放手开始垂直移动。 我怎么能这样做?

directionalLockEnabled属性设置为YES。 从苹果文档:

如果此属性为“否”,则允许在水平和垂直方向上进行滚动。 如果此属性为YES且用户开始以一个大致方向(水平或垂直)进行拖动,则滚动视图将禁止在另一个方向上滚动。 如果拖动方向是对angular线,则不会locking滚动,用户可以向任意方向拖动直到拖动完成。 默认值是NO

这个问题被接受的答案并不完全正确。 根据directionalLockEnabledlocking的当前文档(原始答案中引用):

如果拖动方向是对angular线,则不会locking滚动,用户可以向任意方向拖动直到拖动完成。

我发现这是我自己的情况。 如果拖动的初始方向接近x和y轴之间的45度angular,则方向locking失败。 如果您在水平或垂直方向上拖动或多或less,locking会激活。

要获得真正的单轴locking的一种方法,请参阅此链接: http : //bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html

实现此目的的简单方法是将directionalLockEnabled设置为YES并像这样实现UIScrollerView委托

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0) { scrollView.contentOffset = CGPointMake(0, 0); } } 

这对我来说基于@Joe xi的答案。 Swift 3.0

 func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 { scrollView.contentOffset = CGPoint(x: 0, y: 0) } }