iOS Autolayout和UIToolbar / UIBarButtonItems

我有一个启用了自动布局的iOS视图,并且有一个UIToolbar ,其中包含工具栏中包含的UISearchBarUISegmentControl 。 我希望UISearchBar具有灵活的宽度,因此我需要添加一个约束来强制执行此操作,但是我可以告诉您无法在Interface Builder中的UIToolbar中为项添加约束。 所有选项均已禁用。

AutoLayout之前,我将使用autoresizingmasks完成此autoresizingmasks

UIToolbars/UINavigationBars是否不允许使用约束?

使用autolayout时如何才能实现这一目标?

Autolayout约束仅适用于UIViews及其子类。

虽然UIToolbar允许一些基于UIView的项(例如UISearchBarUISegmentedControl ),但它们可能必须与不从UIViewinheritance的UIBarButtonItems共存。

直到autolayout可以使用UIBarButtonItems ,就像你做的那样。

您可以选择使用仅基于UIViews小部件来滚动自己的工具栏。

这也可以直接从故事板完成。

只需拖放工具栏中的项目,然后将其中的一些项目转换为灵活或固定的空间即可获得所需的效果。 请参阅以下两个示例。

均匀分布的

中心

注意:这是我对齐UIToolBar项目的答案的副本,我在寻找这样的解决方案时遇到了两个问题

你至少可以在代码中执行此操作; 我是抛弃Interface Builder的类型,无论如何都要在代码中使用它。 在添加或调整约束时,IB似乎更经常地妨碍我。 这是我在自定义UIToolbar子类的-initWithFrame:方法中所做的。

 - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self addSubview:self.label]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; } return self; } 

因为我喜欢尽可能地延迟加载,所以这是我的self.label实例变量(在[self addSubview:self.label]上面收到消息时调用)。

 - (UILabel *)label { if (_label) return _label; _label = [UILabel new]; _label.translatesAutoresizingMaskIntoConstraints = NO; _label.textAlignment = NSTextAlignmentCenter; return _label; } 

似乎适合我。 不过,我不会添加任何UIBarButtonItems ,所以你的里程数会有所不同。