【问题标题】:UIScrollView won't scroll!UIScrollView 不会滚动!
【发布时间】:2025-11-24 19:45:02
【问题描述】:

在 IB 中,我有我的 UIView。然后我有一个带有 UIScrollView 作为子视图的子 UIView。然后 UIScrollView 有一个子 UIImageView。 UIScrollView 和 UIImageView 的大小相同。它们比作为子视图的 UIView 大得多。我认为这会使滚动工作。它没有。滚动视图是否需要某种代码才能工作?

【问题讨论】:

    标签: iphone interface-builder ios4 uiscrollview


    【解决方案1】:

    要滚动,您必须使滚动视图的框架小于其内容、包含的图像或视图。

    【讨论】:

    • 没有运气。滚动视图的子视图(uiimageview)比滚动视图大。
    • 您是否设置了内容大小以匹配图像大小?如果没有,您只是在裁剪图像......没有任何可滚动的内容。
    • 我在IB中设置了帧大小,是这个意思吗?不过我没有对代码做任何事情。
    • 内容大小是在框架内滚动的内容,AFAIK。您需要将其设置为大于框架的图像大小。
    • 阿门。我正在改变滚动视图的宽度以及它的内容大小。不应该。
    【解决方案2】:

    您需要设置UIScrollView.contentSize 以匹配总的可滚动大小,在这种情况下是您的子视图框架大小。

    【讨论】:

    • 我想是的。在 IB 中从未见过。
    • 非常感谢。这真的帮助了我。如果我没有找到这个,我会考虑重做我的界面
    • @tia 我认为 IB 中的“内容插入”就是为了这个。
    • @Sha 使用 API 的第一条规则是您应该按照 API 开发人员建议的方式使用它,否则它可能会在现在或以后或您没有想到的情况下出错。在这种情况下,内容插入用于内容填充,因此不应用于调整内容的区域。有什么不同吗?当然有。即使缩放,内容插入也始终是固定的,因此这意味着如果您启用滚动视图的缩放,那么您的内容将在放大时被剪裁,而在缩小时被填充太多。
    • 一个更好的问题可能是,为什么UIScollView 不能根据其子视图自行解决?
    【解决方案3】:

    我将滚动视图的所有内容都放在了 IB 中。 (按钮、标签、文本字段等)。全尺寸为 500 高。 然后我在 IB 中将其调整为 436 高。

    然后在代码中,我把这是viewDidLoad:

    optionsScrollView.contentSize = CGSizeMake(320,500);
    

    这样我就可以滚动 64 个像素。它完美地工作。

    我还在 .h 文件的@interface 的 大括号中放置了“UIScrollViewDelegate”,并将滚动视图的委托出口与 IB 中的文件所有者绑定。

    【讨论】:

      【解决方案4】:

      更多,你启用滚动了吗? 看楼盘

      @property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled
      

      【讨论】:

        【解决方案5】:

        滚动视图适用于此:
        框架
        然后
        内容大小
        视图或对象等...

        如果您的框架设置为您的内容大小,则它不会滚动。 因此,将您的框架(在 IB 右侧面板中->倒数第二个选项卡“大小检查器”)设置为您的应用程序的长度(在我的情况下,它是 367,因为我有一个导航栏和一个标签栏)然后以编程方式将 contentSize 设置为 - 是的你猜对了……不仅仅是你的框架,所以它可以滚动。

        快乐的日子!!

        【讨论】:

          【解决方案6】:

          这对大多数人来说可能很明显,但我花了很长时间想知道为什么我的 UIScrollView 不会滚动,所以我发布了阻止我的内容,以防它帮助其他人:

          UIScrollView 必须是您希望它在其中呈现的可见区域的尺寸,而不是其内容的大小。

          我知道这很可笑,但以防万一它对某人有所帮助。

          【讨论】:

          • 只是为了澄清一点:UIScrollView 应该是您希望在屏幕上显示的大小,并且滚动视图的 contentSize 属性应该设置为将要显示的区域的大小滚动(内容)。如果 contentSize 小于或等于其帧大小,则滚动视图不会滚动。
          【解决方案7】:

          正如接受的答案中提到的,您必须设置UIScrollViewcontentSize 属性。

          这可以在 Interface Builder 中完成。

          1. 选择滚动视图
          2. 在右侧的实用程序窗格中选择“身份检查”
          3. 在“用户定义的运行时属性”下单击“+”按钮
          4. 将“键路径”值设置为“contentSize”
          5. 将“类型”值设置为“大小”
          6. 将“Value”值设置为“{width, height}”(例如:“{320, 600}”)

          构建并运行,您的滚动视图将滚动。

          内容插入不影响滚动。见What's the UIScrollView contentInset property for?

          【讨论】:

          • 这很好用,很好地解释了如何实现 tia 的初始答案!
          • 多么棒的答案!
          • 如果我希望我的代码跨设备类型工作,这将如何工作,显然 iPad 会比这更宽
          • 你可以检测屏幕尺寸并使用它,对吧?
          • 你知道,我欠你一杯咖啡来回答这个问题:'(你拯救了我的一天:(
          【解决方案8】:

          我在这里没有提到的另一件重要的事情是 UIScrollView 不能很好地与 AutoLayout 配合使用。如果您似乎已正确完成所有操作,请检查您的 ViewController 是否打开了自动布局,如果是,请将其关闭。

          (每次滚动,视图都会重新布局。嘎嘎!)

          所以:

          • 确保滚动视图的contentSize 大于其frame.size
          • 确保 ViewController 的 AutoLayout 已关闭。

          【讨论】:

            【解决方案9】:

            我可以通过以下答案解决滚动问题:

            https://*.com/a/39945124/5056173

            我的诀窍是:

            1. 您现在需要设置内容 UIView 的高度。然后,您可以指定内容视图 (blech) 的高度或使用 通过确保底部包含的控件的高度 控件被限制在内容视图的底部。

            我已经用 center 垂直和水平对齐设置了 scrollView 内视图的高度和宽度,这就是它不起作用的原因! p>

            删除这个约束后,我需要添加等宽(scrollView和scrollView里面的view)AND设置高度 scrollView 内的视图直接与内容。这意味着:视图中的最后一个元素必须对视图有底部约束!

            【讨论】:

              【解决方案10】:

              确保三件事,

              • 检查scrollView frame & contentView frame,你可能会找到答案

              • scrollView.isScrollEnabled = true

              • scrollView 高度的 contentView 不受滚动视图高度的限制

              【讨论】:

                【解决方案11】:

                UIScrollView 不会滚动!

                • 原因:contentSize 与(子)视图相同
                  • 应该:contentSize 比(子)视图
                    • -> UIScrollView 可以滚动

                如何设置UIScrollView contentSize?

                两种方法:

                在代码中

                - (void)viewDidLoad {
                    [super viewDidLoad];
                    。。。
                    //[(UIScrollView *)self.view setContentSize:CGSizeMake(375, 1000)];
                    CGSize curScreenSize = UIScreen.mainScreen.bounds.size;
                    CGFloat scrollWidth = curScreenSize.width;
                    CGFloat scrollHeight = curScreenSize.height * 2;
                    [(UIScrollView *)self.view setContentSize:CGSizeMake(scrollWidth, scrollHeight)];
                

                在 UI(故事板)中

                Storyboard-》Identity Inspector-》User Defined Runtime Attributes-》添加新属性:

                • 内容大小
                  • 类型:尺寸
                  • 值:{375, 1000}

                【讨论】: