1

N個のボタンがあるとしましょう..

//---listOfServicesToDisplay is DYNAMIC
NSMutableArray * arrayOfButtons = [NSMutableArray array];
for (int i=0; i<[listOfServicesToDisplay count]; i++) {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [arrayOfButtons addObject:button];
}

次の制約を使用して、arrayOfButtons を superView に追加したいと考えています。

  • センター Y アライメント (垂直)
  • 中心 X 配置 (水平)
  • 先頭と末尾に 50 のパディングがあります。H:|50-[ボタン]50-|
  • 上部と下部にパディング 1
  • 最も上/下のボタンの場合、そのパディングは動的になります

INTERFACE BUILDERでそれを行うと、次のようになります..(したがって、プログラムで行う必要があります)

ここに画像の説明を入力

4

1 に答える 1

2

これは機能すると思います。ボタンの周りにwrapperViewを設定し、このビュー内にボタンを配置し、スーパービュー内でwrapperViewを中央に配置します。

UIView *buttonView = [UIView new];
[buttonView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:buttonView];

NSLayoutConstraint *horizontal = [NSLayoutConstraint constraintWithItem:buttonView
                                                              attribute:NSLayoutAttributeCenterX
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:buttonView.superview
                                                              attribute:NSLayoutAttributeCenterX
                                                             multiplier:1.0
                                                               constant:0.0];

NSLayoutConstraint *vertical = [NSLayoutConstraint constraintWithItem:buttonView
                                                            attribute:NSLayoutAttributeCenterY
                                                            relatedBy:NSLayoutRelationEqual
                                                               toItem:buttonView.superview
                                                            attribute:NSLayoutAttributeCenterY
                                                           multiplier:1.0
                                                             constant:0];

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:buttonView
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:buttonView.superview
                                                         attribute:NSLayoutAttributeWidth
                                                        multiplier:1.0
                                                          constant:-100];

// height will have to wait until we know what the buttons are up to

[buttonView.superview addConstraints:@[horizontal, vertical,width]];

CGFloat buttonHeight = 50;
CGFloat buttonSpace = 10;

NSInteger numberOfButtons = [buttons count]; // buttons = your array of buttons
for (NSInteger index = 0; index < numberOfButtons; index++) {
    UIButton *button = [buttons objectAtIndex:index];
    [buttonView addSubview:button];

    NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:button
                                                             attribute:NSLayoutAttributeWidth
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:buttonView
                                                             attribute:NSLayoutAttributeWidth
                                                            multiplier:1.0
                                                              constant:0];

    NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:button
                                                              attribute:NSLayoutAttributeHeight
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:Nil
                                                              attribute:NSLayoutAttributeNotAnAttribute
                                                             multiplier:1.0
                                                               constant:buttonHeight];

    NSLayoutConstraint *horizontal = [NSLayoutConstraint constraintWithItem:button
                                                                  attribute:NSLayoutAttributeCenterX
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:buttonView
                                                                  attribute:NSLayoutAttributeCenterX
                                                                 multiplier:1.0
                                                                   constant:0];

    [buttonView addConstraints:@[ width, height, horizontal]];

    // a bit clumsy here, due to the first button
    if (index == 0) {
        NSLayoutConstraint *vertical = [NSLayoutConstraint constraintWithItem:button
                                                                    attribute:NSLayoutAttributeTop
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:button.superview
                                                                    attribute:NSLayoutAttributeTop
                                                                   multiplier:1.0
                                                                     constant:0];

        [button.superview addConstraint:vertical];
    } else{
        UIButton *formerButton = [buttons objectAtIndex:index-1];
        NSLayoutConstraint *vertical = [NSLayoutConstraint constraintWithItem:button
                                                                    attribute:NSLayoutAttributeTop
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:formerButton
                                                                    attribute:NSLayoutAttributeBottom
                                                                   multiplier:1.0
                                                                     constant:buttonSpace];

        [button.superview addConstraint:vertical];
    }
}

UIButton *lastButton = [buttons lastObject];
CGFloat viewHeight = (buttonSpace + buttonHeight) * [buttons count];

NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:buttonView
                                                              attribute:NSLayoutAttributeHeight
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:nil
                                                              attribute:NSLayoutAttributeNotAnAttribute
                                                             multiplier:1.0
                                                               constant:viewHeight];
[buttonView addConstraint:height];

今、私はこれをまったくクリーンアップしようとはしていません。確かに、これをすべて 1 つのブロックにまとめたいとは思わないでしょうが、コンセプトは健全であり、目的を達成できるはずです。個人的には、コードの重複を避けるために、別のクラスを使用して制約を処理することがよくあります。

于 2013-10-29T22:14:58.897 に答える