2015-07-19 17 views
5

Ich habe versucht, eine einfache Containeransicht in IB mit UIStackView einzurichten. Ich möchte, dass dieser Container seine einzige Unteransicht zentriert und die tatsächliche Inhaltsgröße der Unteransicht berücksichtigt.Verwenden von UIStackView zum Zentrieren der Einzelansicht

Leider wird für alle möglichen Konfigurationen von Ausrichtung und Verteilung die Unteransicht gestreckt, um die Breite entlang der Achse zu füllen.

Das sieht nach einem seltsamen Randfall oder einem Fehler aus, denn sobald ich eine zweite Ansicht hinzufüge, verhält sich alles wie erwartet und beide Subviews behalten ihre Größe, die durch die Methode der intrinsischen Inhaltsgröße definiert wird.

Ich würde gerne verstehen, warum UIStackView verhält sich so.

+2

"[Die Stapelansicht pinnt die erste und letzte angeordnete Ansicht bündig mit ihrer Kante entlang der Stapelachse. Für einen horizontalen Stapel bedeutet dies, dass die Vorderkante der ersten angeordneten Ansicht an die Vorderkante des Stapels angeheftet ist und die Hinterkante der letzten angeordneten Ansicht an die Hinterkante des Stapels angeheftet ist. Bei vertikalen Stapeln sind die oberen und unteren Kanten entsprechend angeheftet.] (Https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/) "Wenn Sie also nur eine Unteransicht einfügen Es wird gestreckt, um die Achse des Stapels zu füllen. Siehst du das? –

+1

Ja. Was ich nicht verstehe, ist, warum dies die intrinsische Inhaltsgröße außer Kraft setzt, selbst wenn ich die Inhaltsumgehungspriorität auf hoch setze. –

Antwort

8

UIStackView erstellt Constraints mit einer Priorität von 1000 (die maximal zulässige Priorität), die UILayoutPriorityRequired ist. Auto-Layout ist erforderlich, um diese Einschränkungen wenn möglich zu erfüllen.

Ihre Einschränkung bei "hoher" Priorität (UILayoutPriorityDefaultHigh == 750, vermute ich) konfligiert mit den erforderlichen Einschränkungen der Stapelansicht, so dass automatisches Layout Ihre Einschränkung ignorieren wird.

Wenn Sie die Beschränkungspriorität auf 1000 festlegen, kann das automatische Layout nicht alle erforderlichen Einschränkungen erfüllen. Es wird einen Fehler protokollieren, und es wird eine der Einschränkungen brechen. Sie können nicht auswählen, welche Einschränkung es bricht.

Beachten Sie, dass es nur eine der drei Einschränkungen zu lösen, um das System zu lösen, und es kann jede der drei widersprüchlichen Einschränkungen brechen. Wenn Sie jedoch eine einzelne der drei widersprüchlichen Einschränkungen durchbrechen, bleibt kein System übrig, das Ihre Sicht zentriert. Ihre Ansicht sollte entweder gestreckt oder an einem Ende der Stapelansicht angezeigt werden, je nachdem, welches automatische Layout unterbrochen wird. Und eine zukünftige Version von iOS könnte das automatische Layout ändern, so dass eine andere Einschränkung aufgehoben wird und sich das Layout ändert.

Es ist nicht klar, warum Sie versuchen, eine Stapelansicht zum Zentrieren Ihrer Ansicht zu verwenden. Wenn Sie nur eine Ansicht haben und zentriert werden möchten, erstellen Sie für das übergeordnete Element UIView statt UIStackView und richten Sie die Einschränkungen so ein, dass die Ansicht in der übergeordneten Ansicht zentriert wird.

Wenn Sie eine Stapelansicht verwenden, weil Sie manchmal mehr als eine angeordnete Teilansicht im Stapel haben möchten, sollten Sie zusätzlich zu Ihrer Inhaltsansicht zwei weitere Teilansichten hinzufügen (eine an jedem Ende der Achse)). Erstellen Sie eine Beschränkung gleicher oder gleicher Höhe zwischen den Abstandshaltern.

+0

Danke! Ich wurde von der "Debughierarchie-Ansicht" getäuscht, die _76_ als Priorität der Einschränkung im Inspector zeigte. –

+0

Warum versuche ich die Stapelansicht zum Zentrieren zu verwenden? Ich suchte nach etwas, das komplett in IB eingerichtet werden kann. –

+0

@RobertWijas Mit IB können Sie '.CenterX'- und' .CenterY'-Einschränkungen definieren, die die Ansicht zentrieren. Klicken Sie entweder auf die Schaltfläche "Ausrichten" (die zweite in der unteren rechten Ecke des IB-Arbeitsbereichs) oder ziehen Sie die Maus aus der Unteransicht in die Superansicht und Sie sehen die Optionen "Mitte". Vielleicht verstehe ich deinen Kommentar nicht. – Rob

Verwandte Themen