9

アプリに 3 つのサブビュー (例として) があり、それらの間に次の間隔がある場合:

TOP - 40 ポイント - SUBVIEW 1 - 60 ポイント - SUBVIEW 2 - 80 ポイント - SUBVIEW 3 - 80 ポイント - BOTTOM

自動レイアウトを使用して各サブビューの高さと幅を維持する方法を理解しており、すべてを 3.5 または 4 インチの iPhone 画面に配置できます。


しかし、3.5インチの画面に合わせてから4インチの画面に移動した場合、各間隔が比例して増加するように、どのような制約を作成する必要があるかわかりません(たとえば、40ポイントは47ポイントになります) 、60 ~ 71、80 ~ 95、またはその前後)。

これは可能ですか?または、要素間のすべての間隔を等しくする必要がありますか? (もしそうなら、どうすれば均等にサイズ変更できますか?)


私は自動レイアウトを初めて使用するので、何かを見逃していたり​​、意味がはっきりしていなかったりした場合は、お知らせください。ありがとうございます。

4

2 に答える 2

11

トリックは、ビュー間に1 つだけでなく2 つの制約を追加することです。1 つは "以上" で、もう 1 つは "以下" です。最小サイズ (より大きいまたは等しい) は 3.5 インチ ディスプレイの間隔である必要があります。最大サイズ (小さいまたは等しい) は 4 インチ ディスプレイの間隔である必要があります。

例:

TOP - 40 ポイント - SUBVIEW 1 - 60 ポイント - SUBVIEW 2 - 80 ポイント - SUBVIEW 3 - 80 ポイント - BOTTOM

TOP - SUBVIEW1: Interface Builder で両方を選択します。制約「垂直間隔」を2 回追加します。 1 つを Greater Then または Equal 40 に設定します。もう 1 つを Lesser Then または Equal 47 に設定します。

Greater Then のすべての値の合計 + ビューのすべての高さは 480 ピクセル (3.5") である必要があります。 Lesser Then のすべての値の合計 + ビューのすべての高さは 568 ピクセル (4") である必要があります。

于 2013-01-24T17:44:19.227 に答える
1

これを行う簡単な方法がわかりません。すべてのスペースが等しいものを作成しましたが、それを行うには、スペースを目に見えないラベル (タイトルのないラベルだけ) で埋める必要がありました。そのため、4 つの可視オブジェクトと 5 つの「スペーサー ラベル」がすべて重なり合っていました。4 つの可視オブジェクトすべてに明示的な高さを持たせ、スペーサーには固定の高さを持たないようにしましたが、すべて同じになるように設定しました。

-(void)viewDidLoad {
    [super viewDidLoad];

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary];
    for (int i=1; i<5; i++) { // Labels with titles
        UILabel *b = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 44)];
         b.text = @"This is my label";
        [b setTranslatesAutoresizingMaskIntoConstraints:NO];
        [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]];
    }

    for (int i=1; i<6; i++) { // Spacer labels
        UILabel *l = [[UILabel alloc ]init];
        [l setTranslatesAutoresizingMaskIntoConstraints:NO];
        [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]];
    }

    for (id obj in viewsDict.allKeys) 
        [self.view addSubview:viewsDict[obj]];

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|"
                                                                   options:NSLayoutFormatAlignAllLeading
                                                                   metrics:nil
                                                                     views:viewsDict];


    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[b1]"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:viewsDict];


    [self.view addConstraints:constraints];
    [self.view addConstraints:constraints2];
} 

空間を差別化するには、視覚的な形式ではなく、制約を表現する長い形式を使用する必要があると思います。以下のコードは私にとってはうまくいくようです。上記と同じビューの定義を使用していますが、質問に合わせてタイトル付きラベルの数を 3 に、スペーサーの数を 4 に減らしています。相対間隔は、例のように 2:3:4:4 にする必要があります。

NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:viewsDict[@"l1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con5 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con6 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con7 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeTop multiplier:1 constant:0];
    NSLayoutConstraint *con8 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l4"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
    NSLayoutConstraint *con9 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeHeight multiplier:.66 constant:0];
    NSLayoutConstraint *con10 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0];
    NSLayoutConstraint *con11 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0];
    NSLayoutConstraint *con12 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100];
    NSLayoutConstraint *con13 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100];
    NSLayoutConstraint *con14 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100];

    NSArray *constraints = @[con1,con2,con3,con4,con5,con6,con7,con8,con9,con10,con11,con12,con13,con14];
    [self.view addConstraints:constraints];
于 2013-01-07T16:46:19.327 に答える