您好,我正在尝试在 Storyboard 中设置 ScrollView ,并按照以下步骤进行操作:
- 将 ScrollView 添加到 Root View 。
- 将零空间固定到 super View 的所有边缘。
- 在上面的 ScrollView 中添加一个 UIView (contentView)。
- 将零空格固定到 ScrollView 的所有边缘添加一些小部件到 contentView 并将 contentView 的高度更改为 2000。
我看到这个解决方案适用于我看过的许多教程,但它不适用于我。我究竟做错了什么?我用的是 swift。
谁能一步步解释如何在 Storyboard中设置 ScrollView ?
我的约束:
最佳答案
好吧,让我们想象一下下面的 View 层次结构(请注意,如果您在“身份检查器”的“文档”部分中为这些 View 指定唯一名称,则在 Interface Builder 中查看约束会更容易):
要设置它,您需要在 IB 中添加以下约束(我打算用 VFL 编写它,因为这是显示约束的一种非常简洁的方式):
显然,相对于其父 View (在本例中为主视图)定义 ScrollView :
H:|[scrollView]| V:|[scrollView]|
定义
contentView
这样它的宽度与主视图(
==view
)相同,并且ScrollView 的
contentSize
将更改以适应contentView
的大小。每TN2154 , ScrollView 及其 subview 之间的约束定义了 ScrollView 的contentSize
,而不是 subview 的相对大小。
因此:
H:|[contentView(==view)]| V:|[contentView]|
定义三个标签的布局,使它们在
contentView
中偏移:H:|-[label1]-| H:|-[label2]-| H:|-[label3]-|
与其硬编码
contentView
的高度(以及 ScrollView 的contentSize
),不如定义标签与垂直高度的关系contentView
,它(由于上面的第 2 步)调整 ScrollView 的contentSize
的垂直高度:V:|-[label1]-[label2]-[label3]-|
这就是您需要做的全部。我没有对任何宽度进行硬编码(主视图自动具有宽度, ScrollView 和更重要的 contentView
都定义了与此相关的宽度。但是标签宽度是从contentView
和 contentView
高度(以及 ScrollView 的 contentSize
)是从三个标签的固有高度推断出来的。
最终结果是 IB 中的约束,如下所示:
仅供引用,如果您想进行一些诊断,可以在应用程序在模拟器上运行时单击查看调试按钮:
您可以查看 View (以及可选的约束)并确保一切正常:
您还可以通过 (lldb)
提示查看 _autolayoutTrace
:
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
UIWindow:0x7fbbb3617910
| •UIView:0x7fbbb349a840
| | *UIScrollView:0x7fbbb3491c80
| | | *UIView:0x7fbbb348e180
| | | | *UILabel:0x7fbbb348e450'Label'
| | | | *UILabel:0x7fbbb3490670'Label'
| | | | *UILabel:0x7fbbb3490a70'Label'
| | | UIImageView:0x7fbbb34a3eb0
| | | UIImageView:0x7fbbb34a3800
| | *_UILayoutGuide:0x7fbbb349a970
| | *_UILayoutGuide:0x7fbbb349b460
这确认没有冲突的布局,也没有模棱两可的布局。
关于swift - UIScrollview 不适用于 Storyboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531062/