设置 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
(用于横向模式)。此外,我允许更改标题文本,因此如果用户进行更改,我会重新执行 sizeToFit
和 setFrame
。
这是这样做的方法吗?或者,有没有自动布局方式?
注意:我看过这个问题/答案: 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 设置视图控制器
可以用 UIAppearance 来设置 UINavigationItem 的 titleview 吗?