webentwicklung-frage-antwort-db.com.de

autolayout - macht die Ansichtshöhe relativ zur halben Superviewhöhe

ich bin in letzter Zeit in Autolayouts eingestiegen und ich bleibe bei einem scheinbar trivialen Problembeispiel. Ich habe die Ansicht, ich möchte am oberen Rand des Bildschirms sitzen und die Hälfte der Bildschirmhöhe einnehmen. Einfach vor dem Autolayout - befestigen Sie es einfach und sagen Sie ihm, dass es bei der Größenänderung des Superview vertikal expandieren soll.

Nun, ich kann nicht für mein Leben sehen, wie es geht. Folgendes bekomme ich, wenn ich versuche, dies einzurichten:

autolayout blues

Die Einschränkung für den unteren Platz ist auf "gleich 284" gesetzt, was absolut absolut und für mich völlig unbrauchbar ist, wenn ich zum iPhone4-Layout wechsle, da es 284 Punkte Platz am unteren Rand des Bildschirms hält und die Ansicht auf die Hälfte reduziert wird Größe des Bildschirms. Und es gibt keine Möglichkeit, diese Einschränkung auf einen Bruchteil der Höhe einer anderen Ansicht festzulegen.

Nachdem ich mich eine Weile nicht gekämpft habe, könnte ich mir nur vorstellen, dass Sie eine andere Ansicht unter diese Ansicht einführen, ihre Höhen gleich setzen, sie übereinander und untereinander sitzen lassen und dann die zweite (untere) Ansicht als unsichtbar festlegen .. das wirkt ein bisschen hässlich!

Fehlt mir etwas offensichtliches? ..

124
Mete

Dies ist jetzt in IB ab [mindestens] Xcode 5.1.1 möglich. Obwohl ich einige Zeit gebraucht habe, um herauszufinden, ist es eigentlich ganz einfach:

Erstellen Sie zunächst eine grundlegende Einschränkung für die obere Ausrichtung (Sie müssen auch die unteren, linken und rechten Beschränkungen wie bei normalen Einstellungen festlegen) . Wählen Sie die Einschränkung aus und navigieren Sie zum Inspektor Attribute:

Demonstration of steps above

Dann können Sie den Multiplikator einstellen. Wenn Sie es wünschen, lassen Sie 50% der Superansicht bei 1 stehen, da es nach der Mitte des Supers ausgerichtet ist. Dies ist auch eine großartige Möglichkeit, Ansichten zu erstellen, die sich auch in anderen Prozentsätzen befinden (z. B. 25% der Superansicht).

Demonstration of second step above

154
Firo

Storyboard-Lösung, bei der Sie das genaue Verhältnis zwischen den Ansichten einstellen können:

Set height equality constraint

Jetzt:

Edit constraint's multiplier

GEWINN !!!

Result

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

P.P.S. Manchmal kann es hilfreich sein, den ersten und zweiten Punkt der Einschränkung umzukehren oder den umgekehrten Multiplikator zu setzen (z. B. 2 statt 0,5) (aber diese Methoden sind nicht hilfreich, wenn Sie nicht verstehen, wie Ansichten miteinander zusammenhängen.

169
Fyodor Volchyok

Nach etwas mehr Zeit habe ich mir folgendes ausgedacht. 

Ich stelle es als eine Antwort fest, aber es ist nicht sehr befriedigend, da davon ausgegangen wird, dass Sie dies im Interface Builder nicht wirklich tun können, aber die richtige Einschränkung kann anschließend im Code hinzugefügt werden:

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

}

Grundsätzlich wird ein Multiplikator von 0,5 gegen die Höhe von self.view gesetzt, der auf upperview ..__ wirkt. Ich musste die Priorität der unteren vertikalen Raumbeschränkung in IB auf unter 1000 setzen, um eine Reihe von Laufzeitmeldungen über das Brechen zu vermeiden Einschränkungen auch.

Wenn also jemand im Interface Builder zeigen kann, wie das geht, würde ich meine Frage besser beantworten, ansonsten denke ich, dass dies so gut ist, wie es (für jetzt) ​​wird. 

30
Mete

Etwas einfacher und geradliniger als Methode als die Antwort von Fyodor Volchyok. - Halten Sie die Steuertaste gedrückt und klicken Sie auf die Unteransicht .- Halten Sie die Befehlstaste gedrückt, ziehen Sie den Cursor zum Übersichtsbild und klicken Sie dann auf das Übersichtsfenster .-.

enter image description here

- Klicken Sie anschließend auf den Größeninspektor .-. Doppelklicken Sie dann auf die Einschränkung . enter image description here

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

- Dann ändern Sie den "Multiplikator" auf 0,5 für die Hälfte des Bildschirms oder den gewünschten Bruchteil des Übersichts, den Sie wünschen . enter image description here

8
user444333222

Es gibt auch eine andere Möglichkeit im Code für den Fall, dass Sie zwei Ansichten haben, die beide die gleiche Höhe haben sollten: Setzen Sie einfach die Höhe von view2 auf die Höhe von view1 (der Trick hier ist nicht die explizite Einstellung von view1).

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

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
user444333222