iOS Autolayout:使用约束调整容器大小

时间:2013-05-26 12:26:21

标签: iphone ios storyboard constraints autolayout

我有一个带有容器视图的滚动视图( self.tagScrollContentView )。这是在故事板中。然后我生成按钮并以编程方式将它们放在容器视图中。

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 个答案:

答案 0 :(得分: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. 顺便说一句,您是将按钮宽度约束添加到超级视图中。它可以以任何一种方式工作,但通常你会向最近的公共父级和宽度约束添加一个约束,即按钮本身,而不是它的超级视图。