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

问题描述 投票:0回答:12

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

iphone ipad uiscrollview horizontal-scrolling
12个回答
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


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

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


10
投票

我发现限制滚动视图移动的最安全、最成功的方法是子类化 UIScrollView 并重写 setContentOffset:animated:setContentOffset: 方法(代码如下)。

覆盖这些方法的优点是,它会在任何 UIKit 代码开始对其进行操作之前直接更改请求的 contentOffset,从而避免在 scrollViewDidScroll: 或其他 中修改 contentOffset 时可能发生的任何副作用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];    
}

2
投票

看到this问题,你必须将可滚动大小设置为视图对应的大小,这样就没有东西可以滚动了。


2
投票

如果 UIScrollView 的

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

您想在水平滚动有效时停止水平滚动吗? (即

contentSize
比实际的 UIScrollView 宽度更宽?)如果“是”,你为什么要这样做?


2
投票

你可以试试这个,

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

这里1450是我的视野高度。


1
投票

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

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


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

0
投票

在我的例子中,x 和 y 的 contentSize 高于 UIScrollView。对我来说,meronixe 的答案非常好,但对于我的需求来说还不够完整。不幸的是,水平滚动条仍然可见。

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];

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

0
投票

另一个解决方案: 您可以将对齐顶部位置设置为 -200 或任何您想要的值。


0
投票

水平或垂直滚动锁定

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x != 0 {
        scrollView.contentOffset.x = 0
    }
}

您可以将 x 更改为 y 以进行垂直滚动。

确保添加

UIScrollViewDelegate
,如下所示:

class MyViewController: UIViewController, UIScrollViewDelegate {

}

并为 ScrollView 设置委托

scrollView.delegate = self
© www.soinside.com 2019 - 2024. All rights reserved.