2013-02-20 71 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在這兩個問題而尋找這樣一個解決方案