141

最近自動レイアウトに取り掛かっていて、私は本当に些細な問題の例のように見えるものに固執しています。画面の上部に座って、画面の高さの半分を占めたいという見方があります。自動レイアウトの前は簡単です。所定の位置に固定し、スーパービューのサイズが変更されたときに垂直方向に拡張するように指示します。

今、私は私の人生のためにそれを行う方法を見ることができません。これを設定しようとすると、次のようになります。

自動レイアウトブルース

下部のスペース制約は「等しい284」に設定されています。これは、画面の下部に284ポイントのスペースを維持し、ビューを半分以下に縮小するため、iPhone4レイアウトに変更したときに絶対に使用できません。画面のサイズ。また、その制約を他のビューの高さの一部に等しくなるように設定する方法はありません。

しばらく苦労した後、これを行うために私が考えることができる唯一の方法は、このビューの下に別のビューを導入し、それらの高さを均等に固定し、それらを上下に配置してから、2番目(下)のビューを非表示に設定することです..少し醜いようです!

明らかな何かが欠けていますか?..

4

6 に答える 6

193

任意のビュー間の正確な比率を設定できるストーリーボードソリューション:

高さの等式制約を設定する

今:

制約の乗数を編集する

利益!!!

結果

PSこの方法は、さまざまなネストレベルのビューで機能し、(明らかに)幅に適用できることにも注意してください

PPSは、制約の「最初と2番目の項目を逆にする」か、逆乗数を設定すると役立つ場合があります(たとえば、0.5ではなく2)(ただし、ビューが相互にどのように関連しているかを理解していない場合、これらの方法は役に立ちません)。

于 2014-11-02T14:41:51.620 に答える
175

これは、[少なくとも]Xcode5.1.1以降のIBで可能になりました。理解するのに少し時間がかかりましたが、実際には非常に簡単です。

最初に、基本的な上部配置制約を作成します(通常のように、下部、左、および右の制約も設定する必要があります)。次に、制約を選択し、属性インスペクターに移動します。

上記の手順のデモンストレーション

次に、乗数を調整できます。スーパービューの50%が必要な場合は1、スーパーの中心ごとに配置されるため、そのままにしておきます。これは、他のパーセンテージのビュー(スーパービューの25%など)を作成するための優れた方法でもあります。

上記の2番目のステップのデモンストレーション

于 2014-06-19T18:43:40.897 に答える
31

もう少し時間が経って、私は次のことを思いついた。

私はそれを答えとして指摘していますが、Interface Builderで実際にこれを行うことはできないと想定しているため、あまり満足のいくものではありませんが、後でコードに次のように正しい制約を追加できます。

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

基本的に、self.viewの高さに対して0.5の乗数を設定し、upperviewに作用します。制約の解除に関する大量の実行時メッセージも回避するために、IBの下部の垂直スペース制約の優先度を1000未満に設定する必要がありました。

だから、もし誰かがInterface Builderでこれを行う方法を示すことができれば、それは私の質問にもっとよく答えるでしょう、そうでなければ私はこれが(今のところ)得られるのと同じくらい良いと思います???

于 2013-02-18T14:47:10.307 に答える
10

Fyodor Volchyokの答えよりも、方法よりも少し簡単で簡単です。-コントロールボタンを押したまま、サブビューをクリックします。-コマンドボタンを押したまま、カーソルをスーパービューにドラッグしてから、スーパービューをクリックします。-「アスペクト比」を選択します。

ここに画像の説明を入力してください

-次に、サイズインスペクターをクリックします。-次に、制約をダブルクリックします。 ここに画像の説明を入力してください

-両方の項目で「高さ」が選択されていることを確認してください。 ここに画像の説明を入力してください

-次に、画面の半分、またはスーパービューの任意の部分の「乗数」を0.5に変更します。 ここに画像の説明を入力してください

于 2017-02-08T23:05:48.137 に答える
7

両方が同じ高さである必要がある2つのビューがある場合のコードの別の可能性もあります:view2の高さをview1の高さに設定するだけです(ここでのトリックはview1の高さを明示的に設定することではありません)。

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];
于 2014-05-03T09:40:51.210 に答える
0

Meteの答えの迅速なバージョン:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


}
于 2017-02-08T23:17:04.330 に答える