1

高さの異なる2つのビューを垂直方向に中央に配置しようとしています。

UILabel *view1 = [[UILabel alloc] init];
view1.backgroundColor = [UIColor redColor];
view1.text = @"view1\nline2";
view1.textAlignment = NSTextAlignmentCenter;
view1.numberOfLines = 0;
UILabel *view2 = [[UILabel alloc] init];
view2.backgroundColor = [UIColor greenColor];
view2.text = @"view2\nline2";
view2.textAlignment = NSTextAlignmentCenter;
view2.numberOfLines = 0;
[self.view addSubview:view1];
[self.view addSubview:view2];

NSDictionary *views = @{@"view1": view1, @"view2" : view2};

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

for (UIView *view in views.allValues) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view1]-[view2(==view1)]-|"
                                                                  options:NSLayoutFormatAlignAllCenterY
                                                                  metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=20)-[view1(200)]-(>=20)-|"
                                                                  options:NSLayoutFormatAlignAllCenterY
                                                                  metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=20)-[view2(100)]-(>=20)-|"
                                                                  options:NSLayoutFormatAlignAllCenterY
                                                                  metrics:nil views:views]];

これにより、両方の中心が垂直に整列されますが、それらはスーパービューの下部にあります! ここに画像の説明を入力

スーパービューでも、互いに対してだけでなく、垂直方向に中央揃えにしたい。

このような制約を追加しましたが、機能します。

[self.view addConstraint:
 [NSLayoutConstraint constraintWithItem:view1
                              attribute:NSLayoutAttributeCenterY
                              relatedBy:NSLayoutRelationEqual
                                 toItem:self.view
                              attribute:NSLayoutAttributeCenterY
                             multiplier:1
                               constant:0]];

ここに画像の説明を入力

しかし、私は知りたいのですが、これはビジュアルフォーマットのみを使用して達成することは可能ですか?

4

2 に答える 2

2

はい、可能ですが、スペーサー ビューを追加することによってのみ可能です。したがって、いくつかのビューを作成する場合、それらをスペーサー 1 とスペーサー 2 と呼びましょう。この文字列でビュー 1 を中央に配置できます。

@"V:|[spacer1][view1][spacer2(==spacer1)]|"

これは、view1 の高さが固定されていることを前提としています。ただし、この方法はお勧めしません。投稿の下部に表示されているコードを使用するだけです。

于 2014-12-02T20:37:27.070 に答える
0

「メトリクス」でYを計算するのはどうですか?

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-centerY-[view1(200)]-(>=20)-|"
                                                                  options:NSLayoutFormatAlignAllCenterY
                                                                  metrics:@{@"centerY": @(CGRectGetHeight(self.view.frame)/2.0 - 100)}
                                                                    views:views]];
于 2014-12-02T20:57:45.347 に答える