iOS Autolayout和UIToolbar / UIBarButtonItems

时间:2013-02-20 14:29:16

标签: ios uibarbuttonitem uitoolbar autolayout autoresizingmask

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

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

UIToolbars/UINavigationBars中是否不允许约束?

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

3 个答案:

答案 0 :(得分:26)

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

虽然UIToolbar允许基于UIView的某些项目(例如UISearchBarUISegmentedControl),但它们可能必须与UIBarButtonItems共存但不会继承{ {1}}。

在autolayout可以与UIView一起使用之前,请按照您的操作完成。

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

答案 1 :(得分:9)

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

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

Evenly spaced

Centered

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

答案 2 :(得分:7)

至少可以在代码中执行此操作;我是抛弃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,所以你的里程数会有所不同。