18

高さを変更できるスーパービューに、2 つの UIButtons が上下に並んでいます。2 つのボタンの垂直方向の間隔は一定にする必要がありますが、上部と下部の間隔のサイズを変更して、サイズが変更されたときに 2 つのボタンがスーパービューの中央に配置されるようにする必要があります。

以下に示すように、各ボタンのスーパービューまでの間隔と、ボタン間の一定の垂直方向の間隔に対して、2 つの以下の制約 (優先度は同じ) を作成してみました。 ここに画像の説明を入力

(ここでそれ以下である理由は、このビューが 4 インチ画面の IB で指定された高さで定義されているためですが、3.5 インチ画面では縮小できるためです。) ただし、これではうまくいきません。アプリの実行中のスクリーンショットからわかるように: ここに画像の説明を入力

2 つの制約が両方とも「以下」に設定されている場合でも、2 つの制約自体が等しい値を持つ必要があることを AutoLayout に伝えたいかのようです。私がやろうとしていること、またはおそらくより良い方法を行う方法はありますか?

4

4 に答える 4

7

垂直方向の中央に配置する最も簡単な方法は、NSLayoutAttributeCenterY制約を追加することです。できれば、ビューの中央に近い要素に制約を追加します。また、すべてのビューに垂直方向の間隔の制約がある場合、それらはすべて中央に配置されます。ビュー階層をいじったり、スペーサー ビューを追加したりする必要はありません。

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

位置を調整する必要がある場合は、定数を設定します。例:constant:-30は 30 ポイント上に移動します。

ビューのさまざまな論理領域に基づいて要素を固定することもできます。たとえば、最初のボタンをビューの高さの 25% に固定する場合は、乗数を に設定できます0.5

于 2013-12-02T15:57:19.270 に答える
4

rdelmarに同意しました。ビュー階層を維持したい場合は、別のオプションがあります。

現在、制約を使用して上下にボタンの間隔を空けています。代わりに、2 つの空UIViewの を作成します。これらはスペーサーとして使用されます。ボタンの上部と下部に 1 つずつ配置する必要があります。自動レイアウト制約を使用して、これら 2 つのスペーサー ビューの高さが常に等しくなるようにします。それらがボタンの上部と下部、およびスーパービューの上部と下部にそれぞれ固定されていることを確認してください。

VFL の場合: V:|-[spacer1(==spacer2)]-[button1]-(20)-[button2]-[spacer2(==spacer1)]-|.

コードでこれを行う必要があるかもしれませんが、IB でこれができるかどうかはわかりません。

于 2013-07-11T16:25:40.313 に答える
2

これを実現する 1 つの方法は、2 つのボタンを別の UIView で囲み、そのビューをコントローラーのビューの中央に配置することです。このビューの上部と下部までのボタンの距離を固定し、ボタン間の距離を固定するか、ビューの高さを固定します。

于 2013-07-11T16:16:58.197 に答える