iOS Autolayout和UIToolbar / UIBarButtonItems
我有一个启用了自动布局的iOS视图,并且有一个UIToolbar
,其中包含工具栏中包含的UISearchBar
和UISegmentControl
。 我希望UISearchBar
具有灵活的宽度,因此我需要添加一个约束来强制执行此操作,但是我可以告诉您无法在Interface Builder中的UIToolbar
中为项添加约束。 所有选项均已禁用。
在AutoLayout
之前,我将使用autoresizingmasks
完成此autoresizingmasks
。
UIToolbars/UINavigationBars
是否不允许使用约束?
使用autolayout时如何才能实现这一目标?
Autolayout约束仅适用于UIViews及其子类。
虽然UIToolbar
允许一些基于UIView
的项(例如UISearchBar
和UISegmentedControl
),但它们可能必须与不从UIView
inheritance的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
,所以你的里程数会有所不同。