iOS UIScrollView,我误会了啥?我无法让滚动视图滚动

Posted

技术标签:

【中文标题】iOS UIScrollView,我误会了啥?我无法让滚动视图滚动【英文标题】:iOS UIScrollView, what am I misunderstanding? I cannot get a scrollview to scrolliOS UIScrollView,我误会了什么?我无法让滚动视图滚动 【发布时间】:2016-12-04 22:20:05 【问题描述】:

我是一个相当新的 ios 开发人员,我第一次遇到了滚动视图的需求。我需要设计的页面有点复杂。因为我一直在努力让它正确布局,所以我决定创建一个超级简单的场景,这样我就可以确保我了解如何让 UIScrollViews 工作。显然它没有帮助,因为事情不正常,我在学习了几个教程后被卡住了。

我正在使用 Xcode 8.1 和 Swift 3。

本文末尾的截图。

我有一个包含滚动视图和子视图的场景,其中包含两个标签。我已将标签设置为相距约 700pt 以尝试进行滚动。没有滚动,您只能看到第一个标签。此外,子视图不会扩展到全高。

您可以在屏幕截图中看到,我的滚动视图具有将其固定到超级视图两侧的约束。

子视图也一样。

标签约束将它们定位在子视图中,并且彼此相距 700pt。我认为这会给视图提供实现滚动所需的高度。没有约束错误。

我希望红色子视图填充垂直空间然后滚动。在这一点上,只要有东西在滚动,我就会采用任何布局。什么都没有,我没有得到什么?

截图: (由于链接限制而删除,因为我还是一个新的 SO 用户)


编辑(2016 年 6 月 12 日):

我做了一些改变,离得更近了一点。首先,有人建议我在别处将其中一个标签设置为与滚动视图相同的高度。这现在给了我“反弹”效果,这意味着东西有点滚动;但是,我们仍然只处理一屏内容,因为隐藏在下面的第二个标签被剪掉了。

情况如下:edited hierarchyedited screenshot

【问题讨论】:

您需要设置滚动视图的内容大小。如果您没有明确设置它,那么它将计算其内容的大小,即子视图的大小。由于您已将子视图限制为滚动视图,因此子视图与滚动视图的大小相同。尝试设置子视图和滚动视图之间的约束,使子视图大于滚动视图(例如编辑“child-viewleading == scroll viewleading”并将常量设置为-300) @Paulw11 我认为标签意味着内容大小?此外,我在内容视图上设置了 height = 90 的约束以及顶部/底部/前导/尾随。否则它会抛出一个错误。所以它确实有一个明确的高度。 它将尝试推断内容大小,但由于您已将视图限制为滚动视图,这就是最终的内容大小,假设您希望按钮位于可见屏幕之外基于水平间距。看看如果将按钮的前缘约束到视图的前缘和另一个按钮的后缘并保持间距会发生什么。你应该以冲突告终 我进行了一些编辑,并根据场外建议更接近了。看看编辑后的屏幕截图。 【参考方案1】:

当您在情节提要中使用UIScrollView 时,您需要确保滚动视图能够计算其内容的大小。如果你没有足够的约束,那么你会在 Interface Builder 中得到一个错误:

可滚动内容大小模糊

单击此错误上的信息图标将提示您需要有约束接触滚动视图的所有侧面,并确保您可以跟踪从左到右和从上到下的连续约束线.

您可以使用或不使用您添加的内容视图来实现此目的。我将向您展示如何在没有滚动视图中的内容视图的情况下执行此操作,这仅仅是因为这种方式的约束更少,因此打字也更少。

    将滚动视图添加到根视图 将滚动视图的顶部/左侧/顶部/底部限制为其父视图(根视图)。如果您想要屏幕的整个宽度,请记住关闭对边距的限制 将标签 1 和标签 2 添加到滚动视图中 将标签 1 的顶部/前导/底部约束到滚动视图 将标签 2 的顶部/尾部/底部约束到滚动视图 用 0 个空格将标签 1 的后沿约束到标签 2 的前沿 将标签 1 的宽度限制为等于滚动视图的宽度 将标签 1 的高度限制为等于滚动视图的高度 将标签 2 的宽度和高度限制为等于标签 1 的宽度和高度 没有第 10 步 :)

【讨论】:

我能够让它工作!我的垂直滚动,看起来你的例子是水平的。但是我缺少的部分是您在这里所拥有的标签 1 和 2 如何交互以及相等的高度。我会将此标记为正确。非常感谢您的帮助和耐心! 抱歉,我一定误解了您所追求的滚动方向,但是您发现基本方法在任一轴上都有效【参考方案2】:

ScrollView 的特殊之处在于它们喜欢明确地知道它们应该滚动多少。我发现处理此问题的最佳方法是具有以下具有一些约束的层次结构:

-Scroll View
    -Content View
        -View (constrained to top, bottom, leading, trailing anchors)
            -Your other views (e.g. Label)

通过让一个 View 位于 Content View 之下,然后在该 View 中包含所有其他 View,ScrollView 就知道它应该滚动多少(它只使用一个子 View 的大小),无论多少您在子视图中拥有的东西。

让我看看我是否可以从我的一个项目中拍摄一个示例的照片。与此同时,试试这个层次结构,让我知道它是否适合你。您可能会将 Label 约束到子 View 的顶部和前导锚点,然后将高度约束到比屏幕高的东西(例如 1000 个单位)。

如果您有任何问题,请告诉我。

编辑:下面的示例层次结构

【讨论】:

以上是关于iOS UIScrollView,我误会了啥?我无法让滚动视图滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 和 UIPageControl,我做错了啥?

我在我的功能中遗漏了啥吗?

iOS推送通知我做错了啥? [关闭]

iOS 7:UIDocument / UIManagedDocument 和 iCloud 发生了啥?

在 iOS 中删除内存映射文件 - 幕后发生了啥?

我在编写代码以检索 IOS 资产库时遗漏了一个步骤,但我遗漏了啥?