使用 UINavigationBar 和 UIBarButtonItem 自动布局

Posted

技术标签:

【中文标题】使用 UINavigationBar 和 UIBarButtonItem 自动布局【英文标题】:Auto Layout with UINavigationBar and UIBarButtonItem 【发布时间】:2013-07-18 17:13:32 【问题描述】:

我喜欢将我的视图创建为独立的 Xib 文件,然后实例化它们并添加为子视图。

因此,在使用UINavigationBar 时,我希望能够做同样的事情,首先从 Xib 创建我的自定义视图,然后将其作为自定义视图添加到 UIBarButtonItem

UIBarButtonItem *anItem = [[UIBarButtonItem alloc] initWithCustomView:_myCustomView];

然后添加到导航栏:

self.navigationBar.topItem.rightBarButtonItems = @[ anItem, anotherItem ];

到目前为止一切顺利。

现在,_myCustomView 使用自动布局 (AL),我认为这不会有问题。 并非如此。我几乎尝试了所有方法。没有任何效果。我什至尝试将自定义视图添加为具有导航栏的控制器的子视图。认为作为视图层次结构中的兄弟姐妹,AL 会将其视为UINavigationBar 之外的常规视图。

那也没用。控制器的updateViewConstraints 被调用但从未应用。视图的初始帧保持在CGRectZero。就好像 AL 看到视图位于 UINavigationBar 之上,即使是同级,并决定它不需要布局。

当然,我试过bringSubviewToFronttranslatesAutoresizingMaskIntoConstraintstranslatesAutoresizingMaskIntoConstraints等等。后者给了可爱:

由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:'自动布局仍然 执行 -layoutSubviews 后需要。我的导航栏 -layoutSubviews 的实现需要调用 super.'

所以,问题是,有没有人从 Xib 加载了一个带有 AL 的自定义视图,并在 UIBarButtonItem 上成功地将其设置为 customView?如果有,怎么做?

【问题讨论】:

我实际上还没有为它提交雷达,但我也遇到了这个问题,这似乎是一个 ios 6 错误。以编程方式创建 UIBarButtonItem 及其视图会出现同样的问题。 您找到解决此问题的方法了吗? 关于该主题的任何消息?我想我在 iOS 7 中仍然有类似的问题(尽管有一个工具栏)。 【参考方案1】:

看起来像 iOS Autolayout and UIToolbar/UIBarButtonItems 的副本

UIBarButtonItems 不继承自 UIView,因此可能不完全支持在其中使用基于自动布局的自定义视图。听起来你必须做预先自动布局的事情,直到问题得到解决。我建议提交一个错误。

编辑:通过预自动布局,我的意思是直接操作视图的框架。

【讨论】:

以上是关于使用 UINavigationBar 和 UIBarButtonItem 自动布局的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar和UINavigationItem的基本分析使用

如何使用自定义背景图像从 UINavigationBar 和 UIToolbar 中删除圆角?

UINavigationBar

使用 UINavigationController 和 UINavigationBar 时图层 y 位置的动画错误

删除 MFMailComposer 和 MFMessageComposer 的自定义 UINavigationBar

UINavigationBar 一个有样式的view