2016-06-02 6 views
0

Ich habe eine Storyboard-Szene mit mehreren Ansichten, einschließlich einer Container-Ansicht mit eigenem View-Controller. Die Hauptansicht der Szene möchte in der Lage sein, vertikal über ihren gesamten Inhalt zu scrollen, aber die Größe von allem (einschließlich des Inhaltsbereichs der Bildlaufansicht) muss von AutoLayout festgelegt werden. Ich habe versucht, Erklärungen durch mehrere andere Fragen hier & in der Apple Docs folgen, aber es scheint eine Kupplung spezifisch für was ich versuche zu tun:AutoLayout Einschränkungen zum Ändern der Bildlaufansicht, wenn die Inhaltsgröße dynamisch geladen wird

Die Container-Ansicht ist eine Liste von Elementen gegeben und jedes Element erscheint in einem quadratischen Rahmen. Diese Rahmen sind in jeder Reihe fünf nebeneinander angeordnet, so viele Reihen wie nötig. Die Anzahl dieser Elemente kann sich jederzeit ändern, sodass die endgültige Höhe des Gitters nicht bekannt ist. Die Höhe des Gitters hängt jedoch von der Breite des Containers ab, da es immer fünf across geben muss.

So eine vernünftige Einschränkung so etwas wie wäre:

container.height = (0.2 * numberOfRows) * containerWidth + 0.0

Laut Dokumentation soll ich diese Einschränkung gründen, um die contentSize der Scroll-Ansicht zu zwingen, alles zu passen, die werden gescrollt.

Sie werden jedoch feststellen, dass es die numberOfRows Komponente dieser Einschränkung ist, die dynamisch ändert - dies ist ein Teil der multiplier Eigenschaft der Einschränkung, wenn ich es mit einem IBOutlet speichern. Und wenn ich versuchte, den Inhalt-holenden Rückruf den Multiplikator zu ändern, wird Compiler-Fehler, weil multiplier schreibgeschützt ist.

Wie kann ich die Höhe dieser Unteransicht des Scrollers dynamisch ändern, während ich immer noch das automatische Layout verwende?

Dieses Bild zeigt hoffentlich etwas von dem, was ich versuche zu tun. Alles oberhalb der letzten Containeransicht ist korrekt mit Einschränkungen ausgerichtet. Der letzte sollte ein Gitter aus Quadraten haben (unbekannte Anzahl). Die Quadrate erhalten ihre Größe durch Layoutbeschränkungen, die ich programmatisch erstelle. Im Moment wird die Inhaltsgröße der Bildlaufansicht jedoch auf die Größe der Bildlaufansicht festgelegt und nicht so erweitert, dass sie die große Collage enthält - so dass kein Bildlauf stattfindet! Storyboard setup

Antwort

0

Der Grund, warum ich dieses Problem fand, war, dass ich "Platzhalter Einschränkungen" nicht korrekt verwendet habe. Grundsätzlich musste ich alle meine Einschränkungen so einrichten, als ob ich keine Frames im Code ändern würde. Bei der einen Einschränkung, die mit meinen programmatischen Rahmenänderungen - der Höhe des unteren Containers - kollidieren würde, musste ich "Platzhalter (vor Build entfernen)" im Inspektorfenster aktivieren. Ich nehme an, dies ermöglicht dem Interface Builder, das Versprechen anzunehmen, dass die Höhendimension zur Laufzeit bereitgestellt wird.

Ein Nachteil dabei war, dass die jetzt unbeschränkte Höhe unvorhersehbar war, bis ich sie manuell einstellte. Also musste ich eine Standardanfangshöhe in viewDidLoad setzen.

Von dem, was ich sagen kann, wird dies der richtige Weg sein, etwas wie "Nur-laden-Einschränkungen" zu erstellen - Einschränkungen, die anfängliche Ladepositionen beeinflussen, aber nicht einschränken, wenn der Rahmen ist wieder aufgebaut. Keine Ahnung ob das kommen oder gar möglich ist.