如何在iOS中锁定scrollView的水平滚动

时间:2011-03-11 10:07:18

标签: iphone ipad uiscrollview horizontal-scrolling

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

10 个答案:

答案 0 :(得分:26)

相同(适应)的答案,如:

Disabling vertical scrolling in 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

答案 1 :(得分:13)

self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

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

答案 2 :(得分:10)

我发现限制滚动视图移动的最安全和最成功的方法是子类 UIScrollView 并覆盖 setContentOffset:animated: setContentOffset :方法(下面的代码)。

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

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

- (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];    
}

答案 3 :(得分:2)

请参阅this问题,您必须将可滚动大小设置为相应的视图大小,以便无需滚动。

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

你可以试试这个,

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

这里1450是我的视野高度。

答案 6 :(得分:1)

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

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

答案 7 :(得分: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];

答案 8 :(得分:0)

在我的情况下,contentSize高于UIScrollView for x和y。对我来说,meronixe的答案非常好,但是我的需求并不完全。不幸的是,水平滚动条仍然可见。

我可以使用

中的以下代码进行更改
- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];

答案 9 :(得分: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