我有一个 UIScrollView 显示垂直数据,但水平组件不比 iPhone 的屏幕宽。问题是用户仍然可以水平拖动,并且基本上暴露了 UI 的空白部分。我试过设置:
scrollView.alwaysBounceHorizontal = NO;
scrollView.directionalLockEnabled = YES;
这有点帮助,但仍然不能阻止用户水平拖动。当然有一种方法可以轻松解决这个问题?
我有一个 UIScrollView 显示垂直数据,但水平组件不比 iPhone 的屏幕宽。问题是用户仍然可以水平拖动,并且基本上暴露了 UI 的空白部分。我试过设置:
scrollView.alwaysBounceHorizontal = NO;
scrollView.directionalLockEnabled = YES;
这有点帮助,但仍然不能阻止用户水平拖动。当然有一种方法可以轻松解决这个问题?
scrollView.bounces = NO;
为我工作。
这很奇怪,因为每当我在任一维度上的屏幕边界内创建具有框架和内容大小的滚动视图时,滚动视图都不会沿该方向滚动(或反弹)。
// Should scroll vertically but not horizontally
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
scrollView.contentSize = CGSizeMake(320, 1000);
您确定框架完全适合屏幕并且 contentSize 的宽度不大于滚动视图的宽度吗?
故事板滚动视图中垂直反弹的复选框可以简单地帮助......
尝试将 scrollView.bounces 设置为 NO 并将 scrollView.alwaysBounceVertical 设置为 YES。
这在 Swift 中对我有用:
scrollView.alwaysBounceHorizontal = false
scrollView.bounces = false
视图是否水平滚动(和反弹)取决于三件事:
如果滚动视图可以适合内容大小加上插图,则它不会滚动或反弹。
避免像这样的水平弹跳:
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width - scrollView.contentInset.left - scrollView.contentInset.right, height);
我添加了这个答案,因为之前的答案没有考虑 contentInset 。
确保 UIScrollView 的 contentSize 不比 UIScrollView 本身宽。在我自己的应用程序中,这足以避免水平滚动,除非我在随机方向上非常疯狂地滑动(例如,在视图仍在减速时开始滚动)。
需要记住的一点:您知道水平方向没有什么可看的,但您的用户会知道吗?您可能需要一点水平反弹,即使没有额外的内容可以水平显示。这让用户知道他们的水平滚动尝试没有被忽略,他们看不到任何东西。但是,是的,通常你真的不想要反弹。
我的 webViews 版本,一个常见的解决方案:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[webView.scrollView setContentSize: CGSizeMake(webView.frame.size.width, webView.scrollView.contentSize.height)];
}
如果为 OS X 开发的任何人都在看这里,从 OS X 10.7 开始,解决方案是在滚动视图上将 Horizo ntalScrollElasticity属性设置为false
/ ,如下所示:NO
迅速:
scrollView.horizontalScrollElasticity = false
目标-C:
scrollView.horizontalScrollElasticity = NO
您可以像这样禁用水平反弹:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.x < 0) {
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
} else if (scrollView.contentOffset.x > scrollView.contentSize.width) {
scrollView.contentOffset = CGPointMake(scrollView.contentSize.width, scrollView.contentOffset.y);
}
}
它手动重置 contentOffset.x 并且不会影响垂直反弹。有用...
就我而言,我只需要设置这一行:
collectionView.bounces = false