24

我有一个启用了自动布局的 iOS 视图,并有一个UIToolbar带有 aUISearchBarUISegmentControl包含在工具栏上的视图。我希望UISearchBar具有灵活的宽度,因此我需要添加一个约束来强制执行此操作,但据我所知,您不能UIToolbar在 Interface Builder 中的项目中添加约束。选项全部禁用。

AutoLayout我用autoresizingmasks.

是否不允许有约束UIToolbars/UINavigationBars

使用自动布局时,这还能如何实现?

4

3 回答 3

26

自动布局约束仅适用于UIViews及其子类。

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

直到 autolayout 可以与 一起工作UIBarButtonItems,照你做的做。

您的替代方法是使用仅基于UIViews.

于 2013-03-27T03:00:06.640 回答
9

这也可以直接从情节提要中完成。

只需在工具栏中拖放项目,将其中一些变成灵活或固定的空间即可获得所需的效果。请参阅下面的两个示例。

均匀分布的

居中

注意:这是我对Aligning UIToolBar items的回答的副本,我在寻找这样的解决方案时偶然发现了这两个问题

于 2014-11-28T15:01:12.787 回答
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内容,因此您的里程数会有所不同。

于 2013-06-19T15:32:36.167 回答