23

我有一个 UIScrollView ,我希望它能够在两个方向上滚动(目前可以),但一次只能滚动一个。因此,例如,如果您开始水平滚动它,它根本不会垂直移动,直到您松开并开始垂直移动它。我怎么能这样做呢?

4

4 回答 4

62

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

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

于 2012-06-12T17:46:19.940 回答
6

这个问题的公认答案并不完全正确。根据当前的文档directionalLockEnabled(在原始答案中引用):

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

我自己也发现了这种情况。如果拖动的初始方向接近 x 轴和 y 轴之间的 45 度角,则方向锁定将失败。如果您或多或少地水平或垂直拖动,则会激活锁定。

有关实现真正单轴锁定的一种方法,请参阅此链接: http ://bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html

于 2015-05-12T14:39:43.847 回答
2

实现这一点的简单方法是像这样设置directionalLockEnabledYES实现 UIScrollerView 委托

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.x != 0 &&
        scrollView.contentOffset.y != 0) {
        scrollView.contentOffset = CGPointMake(0, 0);
    }
}
于 2016-03-25T10:36:30.107 回答
1

根据@Joe xi 的回答,这对我有用。斯威夫特 3.0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 {
        scrollView.contentOffset = CGPoint(x: 0, y: 0)
    }
}
于 2017-10-18T10:29:38.940 回答