Frage Auto-Layout - Höhe der Ansicht relativ zur halben Superview-Höhe


Ich bin in letzter Zeit auf Autolayouts gestoßen und stehe fest auf einem scheinbar trivialen Problembeispiel. Ich habe die Ansicht, dass ich oben auf dem Bildschirm sitzen und die Hälfte der Bildschirmhöhe einnehmen möchte. Einfach vor dem automatischen Layout - heften Sie es einfach an und sagen Sie ihm, dass es sich vertikal ausdehnt, wenn die Superansicht in der Größe verändert wird.

Nun, ich kann nicht für das Leben von mir sehen, wie es geht. Hier ist, was ich bekomme, wenn ich versuche, dies einzurichten:

autolayout blues

Die untere Leerzeichenbeschränkung ist auf "equals 284" gesetzt, was absolut und absolut nutzlos für mich ist, wenn ich zum iPhone4-Layout wechsel, da es am unteren Bildschirmrand 284 Punkte Speicherplatz hält und die Ansicht nicht länger halbiert Größe des Bildschirms. Und es gibt keine Möglichkeit, diese Beschränkung so einzustellen, dass sie einem Bruchteil der Höhe einer anderen Ansicht entspricht.

Nachdem ich mich eine Weile angestrengt habe, kann ich mir nur eine andere Ansicht unterhalb dieser Ansicht vorstellen, ihre Höhen gleichmäßig festlegen, sie übereinander und untereinander setzen lassen und dann die zweite (untere) Ansicht unsichtbar machen .. das scheint ein bisschen hässlich!

Fehle ich etwas Offensichtliches? ..


117
2018-02-18 12:01


Ursprung


Antworten:


Dies ist jetzt in IB ab [mindestens] Xcode 5.1.1 möglich. Obwohl es mich irgendwann brauchte, um herauszufinden, ist es wirklich super einfach:

Erstellen Sie zunächst eine grundlegende obere Alignment-Einschränkung (Sie müssen auch die unteren, linken und rechten Constraints wie üblich einrichten) . Wählen Sie dann die Einschränkung und navigieren Sie zu Attribut Inspektor:

Demonstration of steps above

Dann können Sie den Multiplikator einstellen. Wenn du es willst, lass es 50% der Super View lassen 1, da es nach dem Super-Zentrum ausgerichtet ist. Dies ist auch eine gute Möglichkeit, Ansichten zu erstellen, die auch andere Prozentsätze sind (wie 25% der Superansicht).

Demonstration of second step above


142
2018-06-19 18:43



Storyboard-Lösung, bei der Sie ein genaues Verhältnis zwischen den Ansichten festlegen können:

Set height equality constraint

Jetzt:

Edit constraint's multiplier

PROFITIEREN!!!

Result

P.S. Beachten Sie auch, dass diese Methode mit Ansichten auf verschiedenen Verschachtelungsebenen und (offensichtlich) für die Breite anwendbar ist

P. P. S. manchmal kann es hilfreich sein, das erste und zweite Element der Abhängigkeit umzukehren oder den Umkehrmultiplikator zu setzen (zum Beispiel 2 statt 0.5) (aber diese Methoden sind nicht hilfreich, wenn Sie nicht verstehen, wie sich Ansichten zueinander verhalten).


157
2017-11-02 14:41



Nach etwas mehr Zeit habe ich folgendes gefunden.

Ich nehme es als Antwort zur Kenntnis, aber es ist nicht sehr befriedigend, da es voraussetzt, dass Sie dies in Interface Builder nicht tun können, aber die korrekte Einschränkung kann später im Code hinzugefügt werden als:

- (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];

}

Im Grunde stellt es einen Multiplikator von 0,5 gegen die Höhe von self.view ein und wirkt auf die Obersicht. Ich musste die Priorität der unteren vertikalen Raumbeschränkung in IB auf weniger als 1000 setzen, um eine Reihe von Laufzeitnachrichten über das Brechen von Beschränkungen zu vermeiden.

Wenn also irgendjemand zeigen kann, wie man das im Interface Builder macht, würde das meine Frage besser beantworten, sonst denke ich, das ist so gut wie es geht (vorerst) ???


30
2018-02-18 14:47



Es gibt auch eine andere Möglichkeit im Code, wenn Sie 2 Ansichten haben, die beide die gleiche Höhe haben sollten: Legen Sie einfach die Höhe von view2 auf die Höhe von view1 fest (der Trick hier ist nicht explizit die Höhe von view1).

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

7
2018-05-03 09:40



Etwas einfacher und geradliniger als die Methode als die Antwort von Fjodor Volchyok. - Halten Sie den Steuerknopf gedrückt und klicken Sie auf die Unteransicht. - Halten Sie die Befehlsschaltfläche gedrückt, ziehen Sie den Cursor auf die Übersicht und klicken Sie dann auf die Übersicht. -Wählen Sie "Aspect Ratio".

enter image description here

Klicken Sie dann auf den Größeninspektor. - Doppelklicken Sie dann auf die Abhängigkeit. enter image description here

- Stellen Sie sicher, dass "Höhe" für beide Elemente ausgewählt ist. enter image description here

- Ändern Sie dann den "Multiplikator" für die Hälfte des Bildschirms auf 0,5 oder den gewünschten Teil des Superviews. enter image description here


6
2018-02-08 23:05



Schnelle Version von Metes Antwort:

    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
2018-02-08 23:17