26

我有一个滚动视图。我希望它只在一个方向(垂直)滚动。有没有办法可以锁定水平滚动...??...

4

10 回答 10

26

为您提供相同(改编)的答案,如:

在 UIScrollView 中禁用垂直滚动

是的,这里的所有答案都可以...

但是如果由于某种奇怪的原因你的 contentSize 应该高于 UIScrollView两个维度,你可以禁用实现UIScrollView协议方法的水平滚动-(void)scrollViewDidScroll:(UIScrollView *)aScrollView

只需将其添加到您的UIViewController

float oldX; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)];
    // or if you are sure you wanna it always on left:
    // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)];
}

它只是用户滚动时调用的方法UIScrollView,这样做会强制它的内容始终相同。x

于 2011-03-11T11:05:26.633 回答
13
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

应该有帮助。我只是通过使用类似的技术水平锁定了我的滚动视图。

于 2011-03-11T12:53:37.337 回答
10

我发现约束滚动视图移动的最安全和最成功的方法是继承 UIScrollView并覆盖setContentOffset:animated:setContentOffset:方法(代码如下)。

覆盖这些方法的优点是它在任何 UIKit 代码开始对其进行操作之前直接更改请求的contentOffset ,避免在scrollViewDidScroll:或其他UIScrollViewDelegate方法中修改 contentOffset 时可能发生的任何副作用。

创建新的子类只需要几分钟,它就像一个魅力。

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset animated:animated];
}

- (void)setContentOffset:(CGPoint)contentOffset {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset];    
}
于 2011-05-13T13:44:08.403 回答
2

看到这个问题,你必须将可滚动大小设置为视图的相应大小,这样就没有什么可以滚动的了。

于 2011-03-11T10:17:31.090 回答
2

如果 UIScrollView 的contentSize属性与 UIScrollView 的实际宽度相同,则无法进行水平滚动。

您想在水平滚动有效时停止水平滚动吗?(即contentSize比实际的 UIScrollView 宽度更宽?)如果“是”,你为什么要这样做?

于 2011-03-11T10:18:31.870 回答
2

你可以试试这个

self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);

这里 1450 是我的视野高度。

于 2011-12-05T11:26:01.617 回答
1

如果您将 contentSize 宽度设置为大于 scrollView 框架,则 scrollView 只能水平滚动。如果将 contentSize 宽度设置为与滚动视图相同,它将不会滚动。例如

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

于 2011-03-11T10:20:16.893 回答
1

哦,因为 iOS7 使用这个(在 initWithNibName 中):

self.automaticallyAdjustsScrollViewInsets = NO;

并创建 3 页的页面滚动条

self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
于 2014-01-22T10:52:53.483 回答
0

在我的情况下,contentSize 高于 x 和 y 的 UIScrollView。对我来说,meronixe 的回答效果很好,但对于我的需求来说还不够完整。不幸的是,水平滚动条仍然可见。

这我可以用下面的代码改变

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
于 2013-08-05T16:16:29.117 回答
0

迅速

禁用contentOffset.x = 0水平滚动

   extension ViewController: UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
            scrollView.contentOffset.x = 0//to lock horizontal scrolling
            //scrollView.contentOffset.y = 0//to lock vertical scrolling
        }
    }

此外,您可以禁用滚动指示器

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
    scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator
于 2017-12-05T12:37:25.353 回答