web-dev-qa-db-ja.com

autolayout-スーパービューの半分の高さを基準にしてビューの高さを作成します

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

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

autolayout blues

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

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

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

130
Mete

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

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

Demonstration of steps above

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

Demonstration of second step above

158
Firo

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

Set height equality constraint

現在:

Edit constraint's multiplier

PROFIT !!!

Result

追伸また、このメソッドは異なるネストレベルのビューで機能し、(明らかに)幅に適用できることにも注意してください。

P.P.S.場合によっては、制約の「最初と2番目の項目を逆にする」か、逆乗数を設定すると便利な場合があります(たとえば、0.5ではなく2)。

176
Fyodor Volchyok

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

私はそれを答えとして注目していますが、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でこれを行う方法を示すことができれば、それは私の質問に答える方が良いでしょう、そうでなければ、これは(今のところ)得るのと同じくらい良いと思いますか?

30
Mete

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

enter image description here

-[サイズインスペクター]をクリックします。 -次に、制約をダブルクリックします。 enter image description here

-両方のアイテムで「高さ」が選択されていることを確認します。 enter image description here

-次に、画面の半分、または必要なスーパービューの一部について、「乗数」を0.5に変更します。 enter image description here

8
user444333222

また、同じ高さのビューが2つある場合のコードの別の可能性もあります。view2の高さをview1の高さに設定するだけです(ここでのコツは、view1の高さを明示的に設定しないことです)。

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];
7
brainray

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)


}
0
user444333222