设置 UINavigationItem 的 titleView:setFrame vs. Auto Layout Constraints

Posted

技术标签:

【中文标题】设置 UINavigationItem 的 titleView:setFrame vs. Auto Layout Constraints【英文标题】:Setting UINavigationItem's titleView: setFrame vs. Auto Layout Constraints 【发布时间】:2014-08-26 11:49:48 【问题描述】:

我正在以编程方式切换到使用自动布局,所以这对我来说是全新的。作为一般规则,我认为我应该避免直接设置任何框架......

问题:我想使用 UILabel 作为视图控制器的 UINavigationItem titleView 的视图。

是否可以对导航栏/导航项使用自动布局约束?或者,我们还需要在某些情况下直接设置框架吗?

例如我正在做这样的事情:

UILabel* title = [UILabel new];
title.text = @"Some Title";
[title sizeToFit];
CGFloat titleWidth = title.bounds.size.width;
[title setFrame:CGRectMake(0, 0, titleWidth, 32.0)];
self.navigationItem.titleView = title;

如您所见,我已将该视图的高度设置为32.0(用于横向模式)。此外,我允许更改标题文本,因此如果用户进行更改,我会重新执行 sizeToFitsetFrame

这是这样做的方法吗?或者,有没有自动布局方式?

注意:我看过这个问题/答案: Building a titleView programmatically with constraints (or generally constructing a view with constraints)

通读一遍 - 我仍然不确定是否可以仅使用约束

【问题讨论】:

【参考方案1】:

还有一个技巧...您设置为 navigationItem.titleView 的视图必须没有 translatesAutoresizingMaskIntoConstraints = false 否则它会在导航动画期间飞过导航栏。您还需要确保设置框架的宽度和高度。

【讨论】:

【参考方案2】:

我相信你可以。但你为什么要?无论如何,约束需要是:

超级视图的上边距 身高

从文档中,titleView 在导航框架中居中,并调整大小以适应。因此,从技术上讲,除了上述内容之外,您不需要任何其他内容,但您可能还必须指定超级视图的左边距。

【讨论】:

谢谢。我有两个原因:(1)自动更改视图的高度,例如从纵向到横向。我正在向 UILabel... 添加单击手势识别器,实际上将高度设置为 32 而不是 44 不是问题。 (2) 更新后退按钮...导航控制器根据标题的大小删除隐藏/显示后退按钮文本。使用上面的代码,它的响应方式与我刚刚设置UINavigationItem.title 的方式不同。我想知道使用自动布局是否更正确,并且会导致与后退按钮的正确交互...... 我的经验是你需要做更多的事情来模仿标准标题,特别是如果你只想修改它的一个方面。 更多,例如设置框架或约束...以及与其他UINavigationItem对象交互?还是其他东西?干杯。 用于处理帧大小、旋转,主要是

以上是关于设置 UINavigationItem 的 titleView:setFrame vs. Auto Layout Constraints的主要内容,如果未能解决你的问题,请参考以下文章

为 UINavigationItem 的 titleView 设置视图控制器

UINavigationItem 标题标签设置宽度?

无法以编程方式设置 UINavigationItem 标题

可以用 UIAppearance 来设置 UINavigationItem 的 titleview 吗?

将 UINavigationItem 设置为 nil 后,如何重新添加它?

设置 uinavigationitem 的后退按钮不起作用