使用 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
之上,即使是同级,并决定它不需要布局。
当然,我试过bringSubviewToFront
、translatesAutoresizingMaskIntoConstraintstranslatesAutoresizingMaskIntoConstraints
等等。后者给了可爱:
由于未捕获的异常而终止应用 '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 中删除圆角?
使用 UINavigationController 和 UINavigationBar 时图层 y 位置的动画错误