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

时间:2012-06-12 17:42:23

标签: iphone ios ipad uiscrollview scroll

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

4 个答案:

答案 0 :(得分:55)

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

  

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

答案 1 :(得分:5)

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

  

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分: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)
    }
}