2013-02-20 69 views
21

我有一个iOS视图,启用了自动布局功能,并且UIToolbar与工具栏中包含的UISearchBarUISegmentControl。我想UISearchBar具有一个灵活的宽度,所以我需要添加一个约束来强制这个,但从我可以告诉你不能在Interface Builder中的UIToolbar中的项目添加约束。选项全部禁用。iOS Autolayout和UIToolbar/UIBarButtonItems

之前AutoLayout我会做到这一点autoresizingmasks

UIToolbars/UINavigationBars内部不允许有限制吗?

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

+0

我之前做了一些这样的东西,尽管我基本上只是等待视图的大小改变,然后相应地更新目标视图的框架。如果事实证明没有一种方法可以自动完成,那总是一个选项。 – Brian 2013-02-20 15:25:59

+0

你可以发布图片吗? – 2013-03-20 07:31:00

+0

我会的,但我最终放弃了AutoLayout并回到使用autoresizingmasks。它使用该模型非常有效。 – outerstorm 2013-03-21 12:13:49

回答

23

自动拨号约束只适用于UIViews及其子类。

虽然UIToolbar允许一些UIView基于项目(如UISearchBarUISegmentedControl),他们可能有UIBarButtonItems不从UIView继承共存。

直到自动布局可以与UIBarButtonItems一起使用时,照你所做的那样操作。

您的替代方案是使用基于UIViews的部件来滚动您自己的工具栏。

+4

任何想法,如果苹果正在努力解决这个问题?如果我必须在不同的地方使用AL和旧的方法,它会让我感到不一致... – Petar 2014-11-26 14:48:48

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,所以你的里程数不尽相同。

+0

如果您尝试使用约束来重新定位现有的工具栏,您会发现NSLayoutAttributeCenterX约束非常有用。 – russes 2013-08-09 14:08:08

8

这也可以从故事板完成。

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

Evenly spaced

Centered

注:这是我回答的副本Aligning UIToolBar items,我stumbbled在这两个问题而寻找这样一个解决方案