2013-07-04 20 views
13

Ich möchte in der Lage sein, meine Kindansicht 25% der Größe der Superansicht von oben zu positionieren.Wie positioniere ich eine untergeordnete Ansicht relativ zur enthaltenden Ansichtsgröße?

NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint constraintWithItem:_containerView 
                      attribute:NSLayoutAttributeTop 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:_childView 
                      attribute:NSLayoutAttributeHeight 
                     multiplier:0.25f 
                      constant:0.0f]; 

jedoch jetzt die folgende Ausnahme Ich erhalte:

'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Invalid pairing of layout attributes' 

Warum tritt der Fehler auf und wie kann ich erreichen, was ich will?

Antwort

6

Ober- und Unterkante können nicht in derselben Abhängigkeit verwendet werden. Obwohl es sinnvoll ist, es zu sagen, das System mag es nicht.

Was Sie könnten stattdessen tun, ist so etwas wie ...

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
            attribute:NSLayoutAttributeTop 
            relatedBy:NSLayoutRelationEqual 
            toItem:_containerView 
            attribute:NSLayoutAttributeTop 
           multiplier:1.0 
            constant:_containerView.frame.size.height * 0.25]; 
+0

Das hat super funktioniert, nachdem ich das Kind und Container Ansichten ausgetauscht. – circuitlego

+0

Entschuldigung, ja, du hast Recht. Sie legen die Einschränkung für die untergeordnete Sicht fest, so dass sie die erste sein sollte. – Fogmeister

+1

Beachten Sie, dass sich "_containerView.frame.size.height" im Quer- und Hochformat unterscheidet. Wenn Sie also vom Querformat aus starten, ist der berechnete Wert nicht der gleiche wie beim Hochformat. – Vanja

22

Statt den Rahmen als in der akzeptierte Antwort zu verwenden, können Sie den prozentualen Anteil an den Multiplikator bewegen, wenn Sie den Boden statt Höhe verwenden. Ich verwende diese Technik zur prozentualen Positionierung von Kindansichten. Es ist auch schön, weil der Rahmen des Containers Ansicht nicht eingestellt werden kann, wenn Sie die Einschränkung erstellen möchten:

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
           toItem:_containerView 
           attribute:NSLayoutAttributeBottom 
          multiplier:0.25 
           constant:0]; 
+0

Ist das korrekt, wenn die Containeransicht ihren Frame-Ursprung nicht bei 0,0 hat? –

+3

Das ist perfekt. Es ist möglich, dass NSLayoutAttributeTop und NSLayoutAttributeHeight nicht miteinander kompatibel sind (sie sind nur Zahlen !!) und nicht einmal in den Dokumenten erwähnt (außer wenn ich etwas verpasst habe). Danke für diese Lösung. –

+0

Ehrfürchtig, das sollte die akzeptierte Antwort sein, kein Frame Tweaking – Max

Verwandte Themen