【发布时间】:2012-06-15 15:31:32
【问题描述】:
我有一个 UIScrollView,我希望它能够双向滚动(目前可以),但一次只能滚动一个。因此,例如,如果您开始水平滚动它,它根本不会垂直移动,直到您松开并开始垂直移动它。我该怎么做呢?
【问题讨论】:
标签: iphone ios ipad uiscrollview scroll
我有一个 UIScrollView,我希望它能够双向滚动(目前可以),但一次只能滚动一个。因此,例如,如果您开始水平滚动它,它根本不会垂直移动,直到您松开并开始垂直移动它。我该怎么做呢?
【问题讨论】:
标签: iphone ios ipad uiscrollview scroll
根据@Joe xi 的回答,这对我有用。 斯威夫特 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 {
scrollView.contentOffset = CGPoint(x: 0, y: 0)
}
}
【讨论】:
实现这一点的简单方法是将directionalLockEnabled 设置为YES 并像这样实现 UIScrollerView 委托
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.x != 0 &&
scrollView.contentOffset.y != 0) {
scrollView.contentOffset = CGPointMake(0, 0);
}
}
【讨论】:
这个问题的公认答案并不完全正确。根据directionalLockEnabled 的当前文档(在原始答案中引用):
如果拖动方向是对角线,则滚动不会被锁定 并且用户可以向任意方向拖动,直到拖动完成。
我自己也发现了这种情况。如果拖动的初始方向接近 x 轴和 y 轴之间的 45 度角,则方向锁定将失败。如果您或多或少地水平或垂直拖动,则会激活锁定。
有关实现真正单轴锁定的一种方法,请参阅此链接: http://bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html
【讨论】:
将directionalLockEnabled 属性设置为YES。来自 Apple 文档:
如果此属性为 NO,则允许在水平和垂直方向上滚动。如果此属性为 YES 并且用户开始沿一个大致方向(水平或垂直)拖动,则滚动视图将禁用在另一个方向上的滚动。如果拖动方向是对角线,则滚动不会被锁定,用户可以向任意方向拖动,直到拖动完成。默认值为否
【讨论】:
directionalLockEnabled 已重命名为 isDirectionalLockEnabled