使用 Interface Builder 和 Autolayout 在 UIScrollView 中正确调整 UILabel 的大小?

Posted

技术标签:

【中文标题】使用 Interface Builder 和 Autolayout 在 UIScrollView 中正确调整 UILabel 的大小?【英文标题】:Correctly Size UILabel inside UIScrollView using Interface Builder and Autolayout? 【发布时间】:2014-05-12 19:51:40 【问题描述】:

我在界面生成器中创建了一个简单的视图设置。下面是它的外观:

视图层次结构很简单:

view
- scrollView
-- label

滚动视图显示为 grey 背景锚定到其超级视图顶部、前导、尾随和底部,约束为 0。

标签以yellow 背景显示,并具有如图所示的约束。此外,该标签的水平和垂直都有content hugging priority1000,水平和垂直都有content compression resistance priority1000

纵向时,标签大小正确:

然而,在横向上,标签的水平尺寸不正确(我打算让标签填满屏幕的宽度,如图所示的约束插图较少):

我怎样才能让这个标签在横向上正确调整大小?

【问题讨论】:

【参考方案1】:

为您提供一种解决方案。

1. 将您的 UIScrollView 添加到 container (UIView) 中,并且具有零约束:

2. 为标签添加约束:顶部、底部、前导、尾随空格 = 20。

3. 添加约束:label.width = container.width - 40

为此,在视图结构树中选择标签,点击 ctrl 并拉 到容器。并选择等宽。

然后选择创建的约束并转到它的实用程序并设置 常量值为 40。

您应该获得以下组件:

运行应用程序,转到横向,它就可以工作了!

希望很清楚。最好的问候。

【讨论】:

非常感谢!这是堆栈上的最佳解决方案! 如果我在 Label 下(在同一个 ScrollView 内)有 TableView,我应该如何设置常量? @EvgenyFedin,据我了解,您想在 ScrollView 的底部添加一些 TableView,以便整个查看表格视图而无需内部滚动。 @EvgenyFedin,比如可以在ScrollView上添加tableView,会展开。然后只需将前导、尾随、底部约束添加到超级视图和顶部约束到标签。此外,您应该将约束添加到 tableView 的高度并将其与控制器中的插座连接。然后在每次重新加载表视图数据后更新高度约束:tableHeightConstraint.constant = tableView.contentSize.height。因此,scrollView 将变得足够大。【参考方案2】:

很难说出要添加/删除哪些约束以获得您想要的东西,因为 ios 保留在无法满足所有约束时调整约束的权利。

我用与您相同的视图(UILabel 作为UIScrollView 的子视图)创建了一个空白项目,并进行了一些限制以使 UILabel 在横向上正确调整大小。

必须检查:

确保从 pin 选项设置垂直/水平间距约束,如下所示,并尝试手动删除不需要的约束。

【讨论】:

感谢您的回复。您能否详细说明“做出一些限制以正确调整 UILabel 的大小”? @JRG-Developer 为您的标签添加水平中心约束,它将起作用 首先选择滚动视图,然后选择底部的 PIN 选项,然后单击左右间距,使它们显示为红色(在您的示例中也将它们的值设置为 20)。对UILabel 执行相同操作。此外,如果您使用 Xcode5,您可能会受益于自动 Resolve Auto Layout Issues 选项,选择它,然后从弹出菜单中选择 Add missing constraints

以上是关于使用 Interface Builder 和 Autolayout 在 UIScrollView 中正确调整 UILabel 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Interface Builder 编辑 UITableViewCell 的模式

Interface Builder 约束问题

Interface Builder PREVIEW使用IBDesignable和核心图形(drawrect)?

Builder模式 和 Fluent Interface

Builder模式 和 Fluent Interface

Builder模式 和 Fluent Interface