12

重複の可能性:
自動レイアウトでも間隔

ボタン付きのスクロール可能なバーを作成しようとしています(に似ていますUISegmentedControl)。スーパービューはUIScrollViewです。ボタンがscrollviewに収まらない場合は、scrollviewをスクロール可能にする必要があります。これまでのところ、ほとんどすべてが正常に機能しています。

たくさんのボタンがある(右にスクロール):

スクロールビュー

ボタンはそれほど多くありません:

ビューがスクロールしていません

さて、私の目標は、すべてのボタンを配置する余地がある場合、それらを320pxのビュー全体に均等に分散させることです。ボタン間のスペースの制約を定義するにはどうすればよいですか?

現在、私は次の制約を使用しています(自己はUIScrollView):

UIView *firstButton = self.buttons[0];

[self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(5)-[firstButton]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(firstButton)]];

UIView *lastButton = [self.buttons lastObject];

[self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[lastButton]-(5)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lastButton)]];

UIView *previousView = nil;

for (UIView *view in self.buttons) {
    if (previousView) {
        [self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[previousView]-(5)-[view]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(previousView, view)]];
    }
    previousView = view;
}

スーパービューのタイプをからに変更するとUIScrollViewUIView次の結果が得られますが、それでも希望どおりではありませんが、少なくとも、右端に接続している最後のボタンの制約を探します(これは理にかなっています。コンテンツサイズは自動的に設定されるため、スクロールビューでは発生しません):

スーパービューとしてのUIView

何か案は?

4

1 に答える 1

20
- (void) viewWillLayoutSubviews {
    // UIButton *button1, *button2, *button3, *button 4 ;
    // NSMutableArray *constraintsForButtons ;

    float unusedHorizontalSpace = self.view.bounds.size.width - button1.intrinsicContentSize.width - button2.intrinsicContentSize.width - button3.intrinsicContentSize.width - button4.intrinsicContentSize.width ;
    NSNumber* spaceBetweenEachButton=  [NSNumber numberWithFloat: unusedHorizontalSpace / 5 ] ;

    [self.view removeConstraints:constraintsForButtons] ;
    [constraintsForButtons removeAllObjects] ;
    [constraintsForButtons addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-(space)-[button1]-(space)-[button2]-(space)-[button3]-(space)-[button4]-(space)-|"
                                                                                        options: NSLayoutFormatAlignAllCenterY
                                                                                        metrics: @{@"space":spaceBetweenEachButton}
                                                                                          views: NSDictionaryOfVariableBindings(button1,button2,button3,button4) ] ] ;
    [constraintsForButtons addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[button1]"
                                                                                        options: 0
                                                                                        metrics: nil
                                                                                          views: NSDictionaryOfVariableBindings(button1) ] ] ;
    [self.view addConstraints:constraintsForButtons] ;
}

これはあなたのものほどきれいではなく、4つのボタンがあることを前提としていますが、それらの間隔は同じです。つまり、ボタン間の空のスペースはすべて同じ幅です。これは、button1のNSLayoutAttributeLeadingとbutton2の間の距離がbutton2とbutton3の間の距離と同じであることを意味するものではありません。

肖像画 風景

于 2012-12-16T19:31:14.167 に答える