2013-05-26 89 views
2

我有一個帶有容器視圖的滾動視圖(self.tagScrollContentView)。這是故事板。然後我生成按鈕並通過編程方式將它們放在容器視圖中。iOS Autolayout:調整具有約束條件的容器

for(NSInteger i = 0; i < allTags.count; i++) { 
    UIButton *tagBt = [[UIButton alloc] initWithFrame:(CGRect){CGPointZero, tagSize.width + 30, 17}]; 
    [self.tagScrollContentView addSubview:tagBt]; 

    [constraintsArray addObject:[NSLayoutConstraint constraintWithItem:tagBt attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:nil multiplier:1.0 constant:tagSize.width + 30]]; 

    if(prevBtRow1) 
     [constraintsArray addObject:[NSLayoutConstraint constraintWithItem:tagBt attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:prevBtRow1 attribute:NSLayoutAttributeRight multiplier:1.0 constant:10.0]]; 
    else 
     [constraintsArray addObject:[NSLayoutConstraint constraintWithItem:tagBt attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.tagScrollContentView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10.0]]; 

    [constraintsArray addObject:[NSLayoutConstraint constraintWithItem:tagBt attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.tagScrollContentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:7.0]]; 

    prevBtRow1 = tagBt; 
} 

[self.tagScrollContentView addConstraints:constraintsArray]; 
[self.tagScrollView layoutSubviews]; 

此代碼將所有按鈕放在一行中,取決於它們的寬度。一切正常。然後,我需要的是放大tagScrollContentView使所有按鈕成爲這個視圖內,而不是在界限之外。然後爲我的滾動指定正確的內容大小,它等於容器視圖。 不幸的是,滾動不能正常工作。內容大小不適合容器視圖。

回答

1

關鍵問題是您的contentSize沒有設置,因爲您沒有將最後一個按鈕的最終尾隨約束添加到其超級視圖。您可以在最後添加一個約束,你的contentSize將自動調整:

for (NSInteger i = 0; i < allTags.count; i++) { 
    UIButton *tagBt = [[UIButton alloc] init]; 
    tagBt.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.tagScrollContentView addSubview:tagBt]; 

    // add all of your constraints 

    prevBtRow1 = tagBt; 
} 

[constraintsArray addObject:[NSLayoutConstraint constraintWithItem:prevBtRow1 
                 attribute:NSLayoutAttributeTrailing 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:self.tagScrollContentView 
                 attribute:NSLayoutAttributeTrailing 
                 multiplier:1.0 
                  constant:10.0]]; 

[self.tagScrollContentView addConstraints:constraintsArray]; 

有幾個不相關的問題:

  1. 我假設你有一個tagBt.translatesAutoresizingMaskIntoConstraints = NO;行沒」不要讓它進入你的代碼示例。

  2. 如果您打算設置約束條件,那麼在做initWithFrame時沒有意義。 init就足夠了。

  3. 我建議在你的按鈕上加一個高度約束,這樣它的約束變得毫不含糊。

  4. 順便說一下,您將按鈕寬度約束添加到超級視圖。它可以以任何方式工作,但通常情況下,您會爲最近的公共父項和寬度約束添加一個約束,這將是按鈕本身,而不是其超級視圖。