Auto-Layout ohne explizite Breite Zwängen und mit größer-oder-gleich-trailing-space Fehlverhalten
Habe ich eine scroll-view enthaltenen Daten werden direkt in der Inhalts-Ansicht einer view-controller in voller Größe in beiden Dimensionen. Die oberen, unteren, vorderen und hinteren Platzverhältnisse aus den Blättern der superview (horizontal) und die layout-Hilfslinien (vertikal) sind alle auf 0 gesetzt. Die VC ist schließlich bedeutete geschachtelt werden als untergeordnete view-controller in einem oder beiden Orten. Ich bin mit einem Storyboard.
Ich habe eine Anzahl von Elementen innerhalb des scroll-view und begrenzt Sie, aber ich bin zu sehen, verschiedene Arten von seltsamen Verhalten. Unten ist ein screenshot mit allen die Untersichten der scroll-Ansicht ausgewählt, um Ihre Einschränkungen. Die scroll-view vier Einschränkungen für die top-level-anzeigen sind nicht sichtbar in ihm. Der view-controller gesetzt wurde, um Freiform-Größe, mit seinen top-level-Sicht (und, dementsprechend, die scroll-view-Inhalte anzeigen) 616 Punkte hoch, die garantiert, dass ein Bildlauf erforderlich sein, zur Laufzeit.
Bevor die Analyse der screenshot, hier ist eine Liste der Dinge, die ich versuche zu erreichen.
- Der vertikale Abstand zwischen den Elementen wird vom designer festgelegt und fixiert werden. (BTW, keiner der vertikale Beschränkungen, text-Stile etc. in diesem Drahtgitter sind endgültig noch nicht, das ganze Bild ist nur für illustrative Zwecke.)
- Alle Aufkleber (außer den obersten) sollte beginnen, auf Ihre innere Größe, eine Erweiterung auf die Breite der scroll-view (minus die standard-HIG horizontalen Abstand von 20 Punkte auf beiden Seiten).
- Tasten sind kaum viel größer sein als diese, aber im Fall der Lokalisierung überraschungen, wir wollen, dass Sie Verhalten sich so wie die Etiketten. (Es gibt eine zusätzliche vertikale ≥ Einschränkung auf "Andere Taste"; es ist irrelevant für diese Frage.)
- Der web-Ansicht eine Feste Höhe und Breite bestimmt werden soll durch die Breite der scroll-Ansicht; standard 20 pt horizontalen Raum auf beiden Seiten.
- Die text-Ansichten haben eine Mindesthöhe (67 Punkte hier), aber Sie sollten vertikal erweitern, wenn der enthaltene text ist zu groß, um zu passen. Keiner von Ihnen bearbeitet werden können oder Scrollbar. Wie der web-Ansicht, sind Sie horizontal Abstand der standard-20-Punkte-abgesehen von den vorderen und hinteren Kanten.
Wie man sehen kann, keines der Elemente die explizite Breite-Einschränkungen. Die ganze Sache stützt sich auf die führende und nachfolgende Leerzeichen Zwangsbedingungen zwischen den Elementen und der scroll-Ansicht. Das layout, in meinem Kopf würde etwas anmutig Arbeit auf hypothetische breiter-als-320 pt iPhones der Zukunft, ohne änderungen an den Einschränkungen. Es funktioniert auch nach dem drehen ins Querformat (es sieht vielleicht ein bisschen albern, aber es würde funktionieren).
Ich gehe durch die Punkte Schritt für Schritt, bezogen auf den screenshot, wo nötig.
1: Dies funktioniert, ist nichts außergewöhnliches hier.
2: Der führenden Einschränkungen der Etiketten sind alle einfach Gleich 20 pt standard-Leerzeichen. Der nachfolgende Einschränkungen sind Größer Als oder Gleich 20 pt standard, angeblich, um die es Ihnen ermöglichen, zu wachsen, um sein scrollView.frame.size.width-40
breit, aber nicht breiter.
3: Gleiche wie 2.
4 und 5: Hier, wo es interessant wird. Der web-Ansicht und die text-Blick sind alle aufgelistet, die als Unangebrachte Ansichten, mit IB sagen deren Rahmen werden verschiedene zur Laufzeit. Die orange gestrichelte Grenzen bezeichnet man die richtigen frames, die nur horizontal so weit wie das längste element mit einem Größer-Als-Oder-Gleich nachfolgende Einschränkung; hier ist es "Eine Schaltfläche Mit einem Langen Titel", dessen Rechte Kante ist, wo die umrandeten Kanten-Ende.
Errichtung dieser Satz von Ansichten und Ihre Einschränkungen, die ich erwartet Probleme zu haben. Ich wusste, es würde schwierig sein, haben UITextViews wachsen vertikal höher als das von ≥ 67 Höhe definiert hier, vielleicht ist nur möglich durch den code. Immer die Etiketten und Tasten zu arbeiten, wie oben spezifiziert, durch die IB allein schien ein wenig zweifelhaft, auch.
Was ich nicht erwarten war, die web-und text-Blick' berichtet, richtigen frame, die nur so breit ist wie die breiteste label oder button. Es scheint, dass mit dieser Einstellung, die scroll-view nicht tatsächlich 320 Punkte breit, sondern nur so breit wie nötig, um zu passen das längste element und den Abstand, und die web-und text-Ansichten erwartet werden, zu erfüllen. Da die scroll-view fest eingeschränkt auf alle Seiten auf der obersten Ebene anzuzeigen, die eingestellt ist, werden 320 Punkte breit, ich habe keine Ahnung, warum das so ist. So ETWAS muss natürlich definieren die anfängliche Breite des scroll-view, aber warum sind nicht die Einschränkungen, die ich gemacht habe aus dem scroll-Blick auf die top-level-Sicht tun?
Angesichts der obigen Spezifikationen für diese Reihe von Ansichten, was muss ich ändern, um es geschehen zu lassen?
Dieser Fall zeigt die Tatsache, dass ich wirklich nicht richtig zu verstehen "Auto-Layout" noch, und ich hoffe, dass die Antworten mich aufklären über viele entscheidende Aspekte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezug auf Xcode Warnungen verlegt Ansichten wählen Sie den view controller im storyboard, Tippen Sie auf die "Beheben" Auto-Layout "Themen" - Taste in der unteren rechten Ecke der Leinwand (es sieht aus wie ein Tie Fighter aus Star Wars), dann wählen Sie "Aktualisieren Alle Bilder in View-Controller". Dies zwingt alle Ihre Ansichten zu reflektieren, Ihre Zwänge.
Mit Auto-Layout mit
UIScrollView
ist ein anderes Tier; so sehr, dass Apple für nötig empfunden zu release ein Technischer Hinweis zur Art der Ausgabe: https://developer.apple.com/library/ios/technotes/tn2154/_index.htmlWenn Sie die Verbindung all dieser Einschränkungen zwischen Untersichten und die inneren Wände von einem scroll-Ansicht, das Ergebnis ist wahrscheinlich nicht das, was Sie erwarten. Wenn Sie die pin eine Untersicht auf die beiden Seiten einer scroll-view, Sie sind nicht in der Tat die Bestimmung der Untersicht in seiner position auf dem scroll-Ansicht. Stattdessen werden Sie bei der Bestimmung der scroll-Ansicht
contentSize
. Das ist seltsam.Sind Sie mit dem Apple sogenannte Reine "Auto-Layout" - Ansatz aus dem Technischen Hinweis. Mit diesem Ansatz werden die Untersichten' Einschränkungen müssen diktieren Sie die scroll-Ansicht
contentSize
.Nehmen wir nur eine der Untersichten und alle ignorieren den rest, sagen Sie eines der text-Ansichten. Und lassen Sie uns nur denken, dass der text-Ansicht entlang der horizontalen Achse. Wenn Sie wollten, dass die text-Ansicht eingeschränkt werden, indem die Breite des scroll-view ohne horizontal scrollen, würden Sie brauchen, um installieren Sie ein fixed-width-constraint auf die text-Ansicht, das war genau die Breite des scroll-view bounds abzüglich der Abstandshalter. Nachdem Sie dies getan haben, wird der Inhalt Größe Breite wäre die Summe der Links, spacer, Breite der text-Ansicht, und das Recht spacer.
Leider nicht installiert werden, eine Einschränkung, die eine Beziehung zwischen der Breite der text-Ansicht und die Breite des scroll-view bounds. Und das ist wirklich schade.
Weiß ich nicht wirklich empfehlen die Installation in einem fixed-width-constraint auf die text-Ansicht. Stattdessen würde ich anfangen und die Verwendung von Apple ' s "kombinierter Ansatz" von der Technischen Hinweis.
Mit dem gemischten Ansatz, die Untersichten' Einschränkungen nicht bestimmen, das scroll-Ansicht
contentSize
. Stattdessen müssen Sie explizit festlegen der scroll-AnsichtcontentSize
und die Rahmen der container-Ansicht (d.h., eineUIView
Inhalte anzeigen).Gehen wir zurück zu, dass
UITextView
und die horizontale Achse. Mit dem kombinierten Ansatz, könnten Sie verlassen die Einschränkungen für die text-Ansicht, wie Sie sind (d.h., keine fixed-width-constraint). Sie könnten explizit gesetzt, wird die Breite der scroll-AnsichtcontentSize
und die Breite der content-Ansicht-Rahmen so früh wieviewDidLoad
. Sie könnten explizit gesetzt, diese Werte zuself.view.bounds.size.width
weil die scroll-Ansicht schmiegt sich an den Seiten des Haupt-Ansicht.Zur Umsetzung des kombinierten Ansatzes, Sie haben zu instanziieren der Inhalts-Ansicht (
UIView
) im code und nicht seinetranslatesAutoresizingMaskIntoConstraints
EigenschaftNO
. Durch die Erweiterung, werden Sie wahrscheinlich benötigen, um erstellen Sie Ihre Einschränkungen für alle diejenigen, die Untersichten sowohl in code als auch (ich weiß nicht von irgendeiner Weise, um dieses). Die visuelle Formatierung von Zeichenfolgen langweiligen und sich wiederholenden, aber Sie sind tatsächlich einfacher, mit zu arbeiten, als Zwänge geschaffen, bei der IB bei der Konfiguration komplexer layouts (dein layout ist ausreichend Komplex).Ich nutzte den kombinierten Ansatz zu lösen, SO dass die Herausforderung hier: https://stackoverflow.com/a/21770179/1239263. Leider ist die Lösung noch nicht geprüft noch. Es ist immer möglich, dass ich mich Nüsse und ich weiß nicht, was ich Rede.