1

これらの新しい制約には根本的な問題があると思います。

UIViewに5つのラベルをすべて上から下に配置するとします。トップラベルは、ビューの上部とその下の次のラベルの間に等間隔で配置されます。次に、各ラベルも等間隔に配置されます。

UIViewの高さを低くしたり、大きくしたりすると、各ラベル間のスペースが均等に変化します。

何を目指すべきか。3番目のラベルをビューの垂直方向の中央に配置してから、中央から他のラベルに制約を追加する必要がありますか、それとも1と2をビューの上部に、3つを中央に、4と5を下部に制約する必要がありますか?

よろしくお願いします。

編集: 以下の答えが追加された後、私はインターフェイスビルダーの制約をいじってみましたが、100%答えているかどうかはわかりませんが、機能していると思います。

すべてのラベルの間には一定の距離があります。でも、リンゴを追いかけるような最小距離もあります。HIGラベル間の距離は15だと思います。だから私のものは30で、15以上の制約を設定しました。これで、iOSは、スーパービューが変更されたときに、30から15までのすべての移動を実行します。

4

1 に答える 1

1

私はもともとボタンを使ってこれを行いましたが、ビューのフレームサイズ(回転時)に自動的に調整されるようにこれを機能させる唯一の方法は、各ボタンの間にラベル(テキストなしで非表示)を追加することでした。含まれているビューと最初と最後のボタンの間。ボタンはすべて固有のサイズであり、ラベルはそうではなかったため、スペースを埋めるためにボタンの高さを自由に変更できました。すべてのラベルを使用するようにコードを変更しました。「b」ラベルはテキスト付きのラベルです。

-(void)viewDidLoad {
    [super viewDidLoad];

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary];
    for (int i=1; i<5; i++) {
        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++) { // these are the 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];
} 

これにより、ビューの左端に標準スペースが配置された等間隔のラベルが作成されます。

于 2012-12-27T19:51:47.853 に答える