使用自动布局在 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 的大小的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?