2

ビュー全体で 4 つのボタンを均等に配置したいと考えています。ストーリーボードでは、縦長のビューにボタンを配置して、間隔が正しくなるようにしました。しかし、どのビュー幅 (iPad の縦向きまたは横向きの場合) でも、ボタンの間隔を均等にするための正しい制約設定が見つかりませんでした。そこで、1 番目と 4 番目のボタンをアンカーとして使用して、ボタンを目的の場所に移動する次のコード スニペットを追加しました。

// evenly space the buttons
CGPoint leftPoint = self.button1.center;
CGPoint rightPoint = self.button4.center;
CGFloat width = rightPoint.x - leftPoint.x;
leftPoint.x += width / 3;
rightPoint.x -= width / 3;
self.button2.center = leftPoint;
self.button3.center = rightPoint;

位置決めコードは正常に機能していますが、調整を行うのに最適な場所を見つけることが困難です。- (void)viewDidAppear:(BOOL)animated が最適な場所のようです。ただし、別のビューにシークすると、このビューに戻ると、ボタンは最初の (ストーリーボードの制約) 指定された位置に戻ります。viewDidAppear コードが再度呼び出されますが、ボタンの移動には成功しません。その時点で彼らの位置は固定されているかのようです。

私の主な質問は、制約を使用して私が求めている均等な間隔を実現する方法があるかどうかだと思います。または二次的な問題は、これら 2 つのボタンの自動配置をオーバーライドする方法です。

4

3 に答える 3

2

これは、レイアウトの制約を使用して行うのは比較的難しいことであり、正確に何をしたいかによって異なります。ボタン間のスペーサーとして使用される 5 つのラベルと共に 4 つのボタン (コード内) を作成する例をここに示します。ボタンのサイズは、固有のコンテンツ サイズによって決定され、ボタン間の間隔、およびボタンと含まれるビューの側面間の間隔はすべて同じです。

-(void)viewDidLoad {
   [super viewDidLoad];

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary];
    NSArray *titles = @[@"Short",@"Longer",@"Short",@"The Longest"];
    for (int i=1; i<5; i++) {
        UIButton *b = [UIButton buttonWithType:1];
        [b setTitle:titles[i-1] forState:UIControlStateNormal];
        [b setTranslatesAutoresizingMaskIntoConstraints:NO];
        [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]];
    }

    for (int i=1; i<6; i++) {
        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:@"|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|"
                                                                   options:NSLayoutFormatAlignAllBaseline
                                                                   metrics:nil
                                                                     views:viewsDict];

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


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

ボタンの間隔は、回転のようにビューのサイズが変わると自動的に調整されます。

于 2012-11-28T16:16:40.513 に答える
1

私が導かれた解決策は、ビューの中央に対して水平に配置する2つの中央のボタン(button2とbutton3)にプログラムで制約を追加することです。これら 2 つの制約により、手動の位置決めコードを完全に削除することができました。コンテナー ビュー内に複数のビューを均等に配置するという答えは、正しい軌道に乗るのに役立ちました。

- (void)viewDidLoad
{
...
    self.button2.translatesAutoresizingMaskIntoConstraints = NO;
    self.button3.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual 
         toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:0.667 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button3 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual 
        toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.333 constant:0]];
于 2012-11-29T03:04:30.407 に答える
0

レイアウト問題の使用方法のほとんどすべての場合layoutSubviews、それを行う場所です。

于 2012-11-28T05:57:25.797 に答える