98

我有一个UIView像 iPhone 的跳板。我使用UIScrollViewand创建了它UIButtons。我想在所述滚动视图上禁用水平滚动。我只想要垂直滚动。我该如何做到这一点?

4

15 回答 15

126

您必须设置contentSize. UIScrollView例如,如果你UIScrollView的宽度是 320 像素(屏幕宽度),那么你可以这样做:

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];

然后UIScrollView将只能垂直滚动,因为它已经可以水平显示所有内容。

于 2009-06-30T16:31:27.040 回答
96

更新:(在@EranMarom 指出他的评论之后)

您可以在方法中停止水平滚动或垂直滚动ScrollViewDelegate​​。这里是如何,

停止水平滚动:

如果要横向滚动,则需要增加contentOffset.x。防止停止滚动视图在水平方向滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.x = 0.0
}

停止垂直滚动:

如果要垂直滚动,则需要增加contentOffset.y。防止在垂直方向停止滚动视图滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.y = 0.0
}

上面的代码阻止了a和 a的变化,x并导致停止滚动方法。yscrollview contentOffsetscrollViewDidScroll:

于 2013-06-09T12:08:42.463 回答
11

从iOS7开始使用

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:45:30.590 回答
11

迅捷解决方案

创建两个出口,一个用于您的视图,一个用于您的滚动视图:

@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!

然后在您的 viewDidLayoutSubviews 中,您可以添加以下代码:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: myView.frame.size.height)
scrollView.contentSize = scrollSize

我们所做的是收集视图的高度和宽度,并设置滚动视图的内容大小以匹配它。这将阻止您的滚动视图水平滚动。


更多想法:

CGSizeMake 使用 CGFloats 获取宽度和高度。您可能需要使用 UIScrollViews 现有高度作为第二个参数。看起来像这样:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: scrollView.contentSize.height)
于 2015-09-02T21:36:50.707 回答
9

就我而言,使用Swift 4.2,您可以使用:

禁用垂直滚动:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}

禁用水平滚动:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0.0
}
于 2019-06-18T14:24:34.153 回答
5

在我的情况下, contentView 的宽度大于 UIScrollView 的宽度,这就是不需要的水平滚动的原因。我通过将 contentView 的宽度设置为 UIScrollView 的宽度来解决它。

希望它可以帮助某人

于 2018-10-31T11:18:06.737 回答
3

您可以选择视图,然后在Attributes Inspector取消选中User Interaction Enabled

于 2016-11-07T02:14:14.613 回答
1

iOS 11 中引入了一个新属性UIScrollView

var contentLayoutGuide: UILayoutGuide

该文档指出,您:

当您想要创建与滚动视图的内容区域相关的自动布局约束时,请使用此布局指南。

除了您可能添加的任何其他 Autolayout 约束外,您还需要将widthAnchor' UIScrollViews约束contentLayoutGuide为与“框架”相同的大小。您可以使用frameLayoutGuide(也在 iOS 11 中引入)或任何外部宽度(例如您superView的 's.)

例子:

NSLayoutConstraint.activate([
  scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])

文档: https ://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide

于 2020-06-17T17:45:41.423 回答
1

@Gulfam Khan 的答案是正确的,我正在添加图像以帮助该概念获得更多可见度。

当我们将 contentView 设置为与 Scroll view 等宽时,如果乘数比 1:1 稍微大一点,我们就会得到水平滚动。

在此处输入图像描述

这是它产生的结果:

在此处输入图像描述

如果您不想要水平滚动,您很可能没有超过超级视图宽度的水平内容。

因此,如果您确保 contentView 的宽度不超过滚动视图的宽度,这将自动解决问题,因为 UIKit 识别到没有水平内容可以滚动到。像这样:

在此处输入图像描述

现在你应该只看到垂直:

在此处输入图像描述

于 2021-06-06T19:55:31.293 回答
0

我为此苦苦挣扎了一段时间,尝试了此线程和其他线程中的各种建议,但均未成功。

但是,在另一个线程中(不确定在哪里),有人建议对 UIScrollView 使用负约束对他有用。

所以我尝试了各种结果不一致的约束组合。最终对我有用的是在滚动视图中添加 -32 的前导和尾随约束,并添加一个宽度为 320(并居中)的(不可见)文本视图。

于 2015-06-18T15:26:36.747 回答
0

我在 viewDidLoad 中设置了 tableview contentInset(如下所示),这是导致水平滚动的原因

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);

检查是否有任何因不同原因设置的 tableview contentInset 并禁用它

于 2017-05-22T08:27:48.660 回答
0

试试这个:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
于 2017-08-19T17:24:27.013 回答
0

通过覆盖contentOffset子类中的属性来禁用水平滚动。

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: 0, y: newValue.y)
  }
}
于 2020-04-13T08:19:56.293 回答
-1

一旦我用只有 1 个单元格的 UITableView 替换 UIScrollView,它就可以正常工作了。

于 2015-05-20T11:31:47.087 回答
-1

使用这一行。

self.automaticallyAdjustsScrollViewInsets = NO;

于 2017-10-06T18:17:43.310 回答