使用自动布局在 NavigationBar 中自动调整 titleView 的大小

Posted

技术标签:

【中文标题】使用自动布局在 NavigationBar 中自动调整 titleView 的大小【英文标题】:Autoresize titleView in a NavigationBar with autolayout 【发布时间】:2013-08-14 15:04:51 【问题描述】:

我希望在我的 UINavigationBar 中的左右 BarButtonItem 之间有一个自定义 UIView,但要尽可能宽。出于这个原因,我在 IB 中向 NavigationBar 添加了一个 UIView。禁用自动布局后,使用自动调整大小的蒙版,一切都按预期工作。 但是在我启用了自动布局的故事板中,我无法让它工作。看起来我不能在 IB 中为 titleView 设置任何约束。如果我将设备旋转到横向模式,UIView 的宽度仍然相同。 我该怎么做才能让 titleView 在启用自动布局的情况下填充我的 UIBarButtonItems 之间的空间?

感谢您的帮助

林纳德

【问题讨论】:

【参考方案1】:

我在我的代码中解决了以下问题:

 - (void)willAnimateRotationToInterfaceOrientation:(__unused UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
 
 [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    CGSize navigationBarSize = self.navigationController.navigationBar.frame.size;
    UIView *titleView = self.navigationItem.titleView;
    CGRect titleViewFrame = titleView.frame;
    titleViewFrame.size = navigationBarSize;
    self.navigationItem.titleView.frame = titleViewFrame;
 

我还没有找到其他解决方案(自动调整大小),但我愿意接受新的和/或更好的解决方案

林纳德

【讨论】:

【参考方案2】:

您可以在代码中添加约束。

viewDidLoad,你可以这样做:

UIView *titleView = [[UIView alloc] initWithFrame:CGRectZero];
self.navigationItem.titleView = titleView;
UIView *titleViewSuperview = titleView.superview;
titleView.translatesAutoresizingMaskIntoConstraints = NO;
[titleViewSuperview addConstraint:[NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:titleViewSuperview attribute:NSLayoutAttributeLeading multiplier:1 constant:0]]; // leading
[titleViewSuperview addConstraint:[NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:titleViewSuperview attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; // top
[titleViewSuperview addConstraint:[NSLayoutConstraint constraintWithItem:titleViewSuperview attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeWidth multiplier:1 constant:0]]; // width
[titleViewSuperview addConstraint:[NSLayoutConstraint constraintWithItem:titleViewSuperview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]]; // height

【讨论】:

由于 titleSuperView 为空,我在宽度约束上崩溃了。其他人有运气吗? 至少在 ios 7 中,您不能修改控制器管理的 UINavigationBar 的约束 @Andy 那么如何为自定义视图提供 (x,y) 信息?

以上是关于使用自动布局在 NavigationBar 中自动调整 titleView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

如果使用自动布局以编程方式创建 UIView 会延迟显示

为啥navigationBar和view之间显示黑屏

用于设置自动布局约束的 iOS 视图层次结构

在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

在 UITableView 中使用自动布局进行动态单元格布局和可变行高