如何使用自动布局调整视图大小以适合标签子视图?

Posted

技术标签:

【中文标题】如何使用自动布局调整视图大小以适合标签子视图?【英文标题】:How to resize a view to fit a label subview using auto layout? 【发布时间】:2014-11-25 08:28:48 【问题描述】:

我正在尝试制作一个带有一些文本的半透明黑色矩形,以向用户传达一些信息。它似乎可以工作,但是当手机的文本大小很大时,标签的内容就会被截断——视图不会扩大它的尺寸。

为了创建它,我添加了一个带有黑色背景和圆角的 UIView,使它有点透明,并在其中放置了一个 UILabel。视图上的约束应该允许它在手机旋转时变宽,并且标签上的约束保持其边缘固定在视图上。

这里是视图的约束:

Align Center X to: Superview
Align Center Y to: Superview
Trailing Space to: Superview >= 40
Leading Space to: Superview >= 40
Width >= 200
Width <= 300
Height >= 100
Height <= 150

以及标签的约束:

Trailing Space to: Superview Equals:Default
Leading Space to: Superview Equals:Default
Bottom Space to: Superview Equals:Default
Top Space to: Superview Equals:Default

在 iPhone 5 上运行时,由于某种原因,视图的大小为 200 x 102,并且文本被截断,尽管它的约束允许它达到 300 x 150。我做错了什么?

【问题讨论】:

***.com/questions/27228279/… 【参考方案1】:

只需将 UILabel Top/Bottom/Lidding/Trailing 约束设置为零,因为它具有内在的内容大小。这意味着标签将希望变得如此宽以包含所有可见的字符串值。看this article

以编程方式创建约束

_constraint=[NSLayoutConstraint constraintWith...];
[self.view addConstraint:_constraint];
//...
_constraint.constant=40;

如果所有约束都在 IB 中定义,则使用 outlet。只需将其连接到您的约束即可。

@property (nonatomic,weak) IBOutlet NSLayoutConstraint *constraint;

【讨论】:

谢谢。将 UILabel 约束设置为零是因为现在 UIView 在手机旋转时会自动变宽,但现在标签文本周围没有填充;文本被推到视图的边缘。将 Top/Bottom/Leading/Trailing 约束设置为“8”之类的内容会提供填充,但是当手机旋转时视图不会调整大小。如何向视图添加一些填充以使其看起来更自然? @smeep 如果您将约束连接到 IBOutlets(或将其保留为类成员),您可以根据需要更改 constant 属性。 对不起,我不明白。您是说在 IB 中将其定义为 0,然后在代码中更改该值吗?我试过了,但现在旋转手机时视图不会调整大小。也许我的假设是错误的——难道不能纯粹用自动布局来做我想做的事吗? 我还是一头雾水。首先,您说将约束设置为零以使标签能够扩展,但随后您展示了将其设置为 40 的示例。当我将常量属性设置为非零值时,看起来视图/标签没有调整大小当手机旋转时正确。也许我没有把我原来的问题说清楚。我有一个包含标签的灰色半透明视图。文本被截断,但我不知道标签是否未正确扩展以允许所有文本,或者视图是否未正确扩展以允许所有标签。 @smeep 如果我理解正确,您需要在设备旋转时更新父视图,不需要更改父视图内的标签边距?你的父视图约束必须由顶部和前导组成。

以上是关于如何使用自动布局调整视图大小以适合标签子视图?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

根据子视图调整超级视图的大小

如何设置自动布局,以便 UILabel 调整大小并根据需要移动其他视图

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

根据最大的子视图使用自动布局调整超级视图的大小

调整子视图大小的自动布局问题