使用UINavigationBar和UIBarButtonItem的自动布局

7

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

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

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

然后将其添加到导航栏中:

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

到目前为止一切都还不错。现在,_myCustomView 使用了自动布局(AL),我以为这不是问题。但事实并非如此。 我已经尝试了几乎所有的方法,但没有一个能起作用。我甚至试图将自定义视图作为具有导航栏的控制器的子视图添加。认为它们作为视图层级结构中的兄弟姐妹,自动布局会将其视为导航栏之外的常规视图。

但这也行不通。虽然调用了控制器的updateViewConstraints 方法,但从未应用到视图的初始框架上,该视图最初的框架仍然保持CGRectZero。就好像自动布局看到视图在UINavigationBar顶部,即使视图作为兄弟姐妹,它也决定不需要进行布局。

当然,我尝试过使用bringSubviewToFront, translatesAutoresizingMaskIntoConstraintstranslatesAutoresizingMaskIntoConstraints等方法。后者给出了如下提示:

终止应用程序,原因:执行-layoutSubviews后仍需要自动布局。MyNavigationBar 的 -layoutSubviews 实现需要调用 super。

因此,问题是,是否有人从 Xib 加载了具有 AL 的自定义视图,并成功将其设置为 UIBarButtonItem 上的customView ? 如果有,如何做到的呢?


我还没有为此提交Radar,但是我也遇到过这个问题,它似乎是iOS 6的一个bug。通过编程方式创建UIBarButtonItem及其视图也会出现同样的问题。 - Ryan
你找到这个问题的解决方法了吗? - Redwarp
有关那个话题的任何消息吗?我认为我在iOS 7中仍然有类似的问题(尽管是与工具栏有关)。 - Joachim Kurz
1个回答

1
看起来是 iOS Autolayout and UIToolbar/UIBarButtonItems 的重复。 UIBarButtonItems 不继承自 UIView,因此在其内使用基于自动布局的自定义视图可能不会得到完全支持。听起来你需要在问题得到解决之前先执行预先自动布局的操作。我建议提交一个错误报告。
编辑:通过“预先自动布局的操作”,我指的是直接操作视图框架。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接