2

内部にコンテナー ビュー ( 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を拡大して、すべてのボタンが境界の外ではなくこのビュー内になるようにする必要があります。次に、コンテナ ビューに等しい正しいコンテンツ サイズをスクロールに割り当てます。残念ながら、スクロールは正しく機能しません。コンテンツのサイズがコンテナ ビューに収まりません。

4

1 に答える 1

1

重要な問題はcontentSize、最後のボタンからスーパービューに最後の末尾の制約を追加していないため、設定されていないことです。最後にもう 1 つの制約を追加すると、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. ところで、スーパービューにボタン幅の制約を追加しています。どちらの方法でも機能しますが、通常は最も近い共通の親に制約を追加し、幅の制約はスーパービューではなくボタン自体になります。

于 2013-05-26T13:02:45.390 に答える