2013-02-18 25 views
113

haben in letzter Zeit in Autolayouts bekommen und ich bin auf was wie ein wirklich triviales Problem scheint stecken. 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.Autolayout - Höhe der Ansicht relativ zur halben Superview Höhe machen

Jetzt kann ich 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 Raum Einschränkung ist auf „gleich 284“, die absolut ist und absolut nutzlos für mich, wenn ich zu iPhone4 Layout zu ändern, wie es behält am unteren Bildschirmrand 284 Punkte Speicherplatz und verkleinert die Ansicht so, dass sie nicht mehr halb so groß ist wie der Bildschirm. Und es gibt keine Möglichkeit, diese Beschränkung auf einen Bruchteil der Höhe einer anderen Ansicht einzustellen.

Nachdem ich eine Weile gekämpft habe, wäre der einzige Weg, wie ich das tun könnte, eine andere Ansicht unterhalb dieser Ansicht einzuführen Höhen gleichermaßen, lassen sie übereinander und unter einander sitzen und stellen dann die zweite (untere) Ansicht unsichtbar dar. Das wirkt ein bisschen hässlich!

bin ich etwas fehlt offensichtlich? ..

+1

Ich glaube nicht, es ist hässlich, aber ein kluger Trick zu bekommen, was Sie wollen IB verwenden. Ich habe dies getan, und wenn Sie richtige Elementnamen verwenden, können Sie klarstellen, was vor sich geht. Sie können sogar ein drittes Element an einer anderen Position haben oder die Größe ändern, basierend auf diesen beiden Unteransichten. – Jelle

Antwort

141

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

Zuerst erstellen Sie eine grundlegende obere Ausrichtung Einschränkung (Sie müssen auch unteren, linken und rechten Einschränkungen, wie normal) . Wählen Sie dann die Einschränkung und navigieren Sie zu dem Attribut Inspektor:

Demonstration of steps above

Dann können Sie den Multiplikator einstellen. Wenn du es 50% der Super View willst, lass es bei 1, da es nach dem Super-Center ausgerichtet ist.Dies ist auch eine gute Möglichkeit, Ansichten zu erstellen, die anderen Prozentsatz sind auch (wie 25% der Super-Ansicht)

Demonstration of second step above

+0

nett :) Ich denke, dieser Beitrag sollte als akzeptierte Antwort markiert werden :) iOS Entwickler bevorzugt Interface Builder Solution lieber als Code-ähnliche Lösung – hqt

+0

@hqt, Danke . Ich denke, als die angenommene Antwort geschrieben wurde, war diese Methode nicht verfügbar. Manchmal wenden sich die Fragesteller nicht an alte Fragen oder kümmern sich darum, die angenommene Antwort zu ändern. Aber letztendlich bin ich nur hier um zu helfen, froh, dass es getan hat! – Firo

+2

Ich bin ein bisschen verwirrt. Ich habe es versucht, aber es zentriert nur den Blick auf den Superview, es passt nicht die Höhe der Ansicht. – Dean

30

Nach ein bisschen mehr Zeit, die ich mit der folgenden habe kommen.

ich es als Antwort bin unter Hinweis darauf, aber es ist nicht sehr befriedigend, da es Sie übernimmt nicht tatsächlich das tut im Interface Builder, aber die richtige Einschränkung kann danach wie in Code hinzugefügt:

- (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, die auf Obersicht wirkt. 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 jemand zeigen kann, wie man das in Interface Builder macht, würde das besser meine Frage beantworten, sonst denke ich, das ist so gut wie es geht (vorerst) ???

+3

Ich denke, das ist so gut wie es jetzt geht. Es wäre schön, wenn Apple uns Zugriff auf den Multiplikatorwert in IB geben würde, so dass dies ebenso wie die Konstante gesetzt werden könnte. – rdelmar

+3

Wenn Sie sich diese Antwort ansehen, können Sie mit Xcode 5.1 nun den Multiplikator über den Interface Builder einstellen. Ich bin jetzt in der Lage, Ansichten zu konfigurieren, die die halbe Höhe ihrer Superview alle über IB sind. –

7

Dort habe ich auch eine andere Möglichkeit im Code, wenn Sie 2 Ansichten haben, die beide die gleiche Höhe haben sollten: einfach die Höhe von view2 auf die Höhe von view1 setzen (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]]; 
+0

War nicht klar, dass Sie auf andere Ansichten für solche Breiten/Höhen verweisen können. Dies ist die sauberste Antwort IMO, wenn Sie bereits in der Sprache des visuellen Formats sind. – loeschg

+0

@brainray Beispiel wird auch unter [developer.apple.com hier] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample erläutert.html # // apple_ref/doc/uid/TP40010853-CH5-SW7) –

147

Storyboard-Lösung, bei der Sie genaues Verhältnis zwischen beliebigen Ansichten einstellen:

Set height equality constraint

Jetzt:

Edit constraint's multiplier

PROFIT !!!

Result

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

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).

+0

Schritt 2 scheint nicht für mich zu arbeiten. Ich kann in der Anzeige nichts auswählen, außer dass ich "Beschränkung auf Rand" umschalte. Ich versuche, die Breite eines UIImageView in einer UITableViewCell auf 50% der Inhaltsansicht festzulegen. – DrMickeyLauer

+1

UPDATE: Offensichtlich erlaubt Interface Builder es nicht, dass die Inhaltsansicht das explizite Ziel von Auto-Layout-Einschränkungen ist. Ich muss eine Dummy-Unteransicht als untergeordnetes Element der Inhaltsansicht einfügen, damit dies funktioniert. – DrMickeyLauer

+1

Es funktioniert für mich. Sie müssen die zwei Ansichten in der Liste und nicht den Builder-Bildschirm auswählen. für Prozentsätze teilen Sie die kleinere Ansicht durch die größere Ansicht, um den Multiplikatorwert zu erhalten Beispiel kleinere Ansicht 25, größere Ansicht 135 - 25/135 = 0,185. Setze dies als Multiplikator, um eine Ansicht zu erhalten, die bei x1 und x2 = 25 ist, aber skaliere mit größeren 6 und 6 usw. – latenitecoder

4

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 in den Superview und klicken Sie dann auf den Superview. -Wählen Sie "Aspect Ratio".

enter image description here

-Dann die Größe Inspector klicken. -Dann doppelklicken Sie 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 was auch immer Fraktion der Superview Sie wünschen. enter image description here

+0

Einfache und schnelle Vorgehensweise! Danke Kumpel –

0

Swift-Version von Mete 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) 


} 
Verwandte Themen