自动布局:包含 UILabel + UIButton 的标题视图

Posted

技术标签:

【中文标题】自动布局:包含 UILabel + UIButton 的标题视图【英文标题】:Autolayout: Title View that Grows to Encompass UILabel + UIButton 【发布时间】:2015-10-02 06:30:09 【问题描述】:

我正在自定义视图控制器的标题视图,以便显示(从左到右):

    一个与默认标题标签非常相似的 UILabel, 信息类型的 UIButton,放置在标签之后固定距离处。

我希望,随着标签水平增长以容纳更长的文本,它会将按钮推向更远的右侧(标签和按钮之间的水平空间保持不变),而整个标题视图会调整自身大小以包含标签和按钮,同时保持在导航栏的中心。

这就是我所做的(界面生成器):

    将 UINavigationItem 拖入导航栏; 将一个 UIView 拖到导航项中,作为标题视图; 将标签和按钮拖到标题视图中,定位和调整大小。

    设置以下约束:

    标签 -> 标题视图:

      领先空间到容器边距 在容器中垂直居中

    按钮 -> 标题视图:

      容器边距的尾随空间 在容器中垂直居中

(标题视图本身不受约束)

但是,标题视图保持固定大小。如果在运行时我设置的标题比情节提要中设置的占位符长,它会被修剪(“...”):

如果我设置一个较短的,标签和按钮之间会出现额外的空间:

或者,如果我添加以下约束:

标签 -> 按钮: 1.水平间距

...现在按钮完全被标签隐藏了:

我怎样才能让标题视图水平增长(同时保持居中),以便它适合(灵活)标签和(固定)按钮,并保持它们之间的空间固定?

【问题讨论】:

【参考方案1】:

导航项未设置为直接处理此问题。您需要使用约束来设置标题视图的框架,然后将其添加到 nab 项目。因此,每次更改文本时,您都需要通过删除视图、调整其大小然后再次添加它来做一些小动作。关键API是systemLayoutSizeFittingSize

【讨论】:

我明白了...也许我最好在单独的 xib 中设计我的标题视图(具有自己的约束),并实例化/配置/添加到导航项(即设置为 @987654322 @) 在运行时? 是的,这是一种干净的方法【参考方案2】:

将按钮的约束更改为标签的水平空间

按钮 -> 标题视图:

要标注的水平空间

在容器中垂直居中

【讨论】:

以上是关于自动布局:包含 UILabel + UIButton 的标题视图的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 自动布局适合

无法在具有动态宽度的 Tablecell 中并排自动布局两个 UILabel

只需要修复 UIButton 和 UILabel 的自动布局问题

首次出现时无法在 UITableViewCell 中更改 UILabel 的框架(使用自动布局)

使更改 UILabel 文本不触发自动布局

带有自动布局的 uilabel 使用填充调整大小