2013-08-13 18 views
26

Auto-Layout, so gut wie es ist, macht mich verrückt mit Einschränkungen. Ich habe den Portrait-Modus in IB entworfen, aber ich kann nicht die gewünschte Landschaftsausrichtung zum Arbeiten bekommen. Arbeiten mit AutoLayout im Hoch- und Querformat

layout

Beachten Sie, dass, wenn die Ausrichtung Änderungen Landschaft, der Abstand zwischen den Blöcken UIImageView abnimmt und die Textausrichtung von SAMPLE TEXT Änderungen nach rechts ausgerichtet ist.

Derzeit habe ich ein paar Einschränkungen hinzugefügt, damit es funktioniert. Ich muss jedoch den Abstand zwischen den UIImageView-Blöcken beibehalten, wodurch er im Hochformat und im Querformat verkrampft aussieht. Ich muss es gleichmäßig im Hochformat verteilen und in der Landschaft komprimieren (wie im Bild oben). In ähnlicher Weise rufen derzeit meine Einschränkungen den Text hervor, aber er hält ihn nicht in der Mitte des Bildschirms und rechtsbündig.

Ist dies überhaupt mit Auto Layout möglich? Wenn das so ist, wie? Hilfe sehr geschätzt.

+0

Zum Erzielen flexibler Abstände sind vielleicht die nächsten Fragen hilfreich: http://stackoverflow.com/questions/17089427/ios-autolayout-vertically-equal-space-to-fill-parent-view und http://stackoverflow.com/ Fragen/13680303/iOS-Auto-Layout-equal-Räume-zu-Fit-Superviews-Breite – Mikhail

+0

Um mit Ansichten Constraint auf Laufzeit zu spielen, wird dies hilfreich [Laufzeitänderung in Autolayout] (http://stackoverflow.com/questions/27414052/moving-views-with-constraints/27420696 # 27420696) – Kampai

Antwort

12

Es gibt mehrere Möglichkeiten, dies zu erreichen. Eine Möglichkeit besteht darin, Ihre 3 Bildansichten in eine UIView einzufügen. Geben Sie die oberen und unteren Randbedingungen der Bildansicht jeweils oben und unten an und geben Sie der mittleren Randbedingung eine centerY-Beschränkung. Geben Sie dieser umschließenden Ansicht eine feste Höhe und Breite und eine Einschränkung für den oberen Rand der Ansicht des Controllers. Erstellen Sie ein IBOutlet für die Höhenbeschränkung für diese umschließende Ansicht und ändern Sie sie bei der Drehung. Im Beispiel unten, ich gab ihm eine Höhe von 350 im Portrait:

-(void)updateViewConstraints { 
    [super updateViewConstraints]; 
    if (self.view.bounds.size.height < self.view.bounds.size.width) { 
     self.heightCon.constant = self.view.bounds.size.height; 
    }else{ 
     self.heightCon.constant = 350; 
    } 
} 

Was das Etikett, der einfachste Weg, um die Einschränkungen zu entfernen, ist man (unten und centerX) hat, und fügen Sie Hinter- und centerY auf Rotation .

+0

Klingt gut. Meine Ansicht reagiert jedoch nicht auf - (void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation Dauer: (NSTimeInterval) Dauer..Ich habe NSLog-ging die 'interfaceOrientation' versucht, aber nichts kommt zur Ausgabe..So habe ich mich für die Orientierungsbenachrichtigung registriert von Gerät, aber das macht Animation träge .. wissen Sie, warum die Ansicht reagiert nicht auf die Methode, die Sie erwähnt –

+0

@ GauravWadhwani, ich weiß nicht, warum das nicht genannt werden würde. Ich habe meinen Beitrag geändert, um den Code in updateConstraints zu stellen. Schau, ob das funktioniert. – rdelmar

+0

Das funktioniert, vielen Dank !!! Hab den ganzen Tag damit verbracht. Fügen Sie einfach die Blöcke hinzu und markieren Sie Ihre Antwort in einem Moment. Nochmals vielen Dank :) –

2

Ja, es ist definitiv möglich, dies mit Auto Layout zu tun. Durch eine Reihe von Schritten, die möglicherweise zu lang sind, um als Antwort zu posten, können Sie den Abstand zwischen Ihren ImageViews beibehalten und die Ausrichtung des Textes beibehalten.

Im Wesentlichen müssen Sie eine Ecke jeder ImageView anheften und einige Einschränkungen entfernen, damit der Abstand nicht automatisch komprimiert wird, wenn Sie die Ausrichtung ändern.

Volle Erklärung, wie man das macht (so ziemlich genau das, was Sie verlangen) is explained in this tuorial. Sie können es etwa auf halbem Weg durch die Seite finden.

Ich hoffe, das ist, was Sie gesucht haben.

+0

Hey, momentan ändert sich die Komprimierung und Textausrichtung nicht.Ich möchte den Raum komprimieren und die Textausrichtung ändern. –

+0

Hast du den Link versucht, den ich angegeben habe? Welchen Raum möchten Sie komprimieren? Es sieht so aus, als wollten Sie nicht, dass sie in der Landschaft komprimiert werden. Wollen Sie sie eigentlich komprimieren? – CaptJak

+0

Ja, ich möchte, dass die Blöcke im Hochformat getrennt und in der Landschaft komprimiert werden, so dass sie wie im Bild gezeigt aussehen. Ich habe den Link früher versucht, konnte das Problem jedoch nicht beheben. Werde aber nochmal lesen :) –

6

Ja, es kann mit Auto Layout durchgeführt werden. Wenn Sie möchten, dass der Abstand zwischen den Ansichten je nach Ausrichtung zunimmt oder abnimmt, können Sie für die Abhängigkeit die Beziehung Kleiner als oder Gleich oder Größer als oder Gleich (anstelle von Gleich) verwenden. Dadurch kann die Entfernung vergrößert oder verkleinert werden:

enter image description here

spielen, um mit, dass und Sie sollten in der Lage sein, zu bekommen, was Sie wollen.

+0

Danke für deine Antwort. Ich habe versucht, diese Einschränkung zu ändern. Aber sobald ich es auf etwas anderes als "Gleich" ändere, gibt es mir eine mehrdeutige Layout-Warnung für die horizontale Positionierung. –

+0

Sie müssen dem oberen und unteren 'UIImageView' andere Einschränkungen hinzufügen, so dass die Verwendung von <= or > = in den Abhängigkeiten zwischen ihnen nicht mehrdeutig ist. – mluisbrown

+0

Ich brauche die Position von UIImage, um vertikal variabel zu sein, also egal welche Beschränkung ich hinzufüge, hat es in der Form <= or => sein. Aber xcode erwartet von mir, dass ich mindestens einen Constraint für die Vertikale hinzufüge, der behoben ist. Wie kann ich eine feste Einschränkung hinzufügen und flexibel halten? –

Verwandte Themen