2012-08-30 16 views
8

Ich habe eine Feder mit aktiviertem Autolayout, die die Ansichten eines Ansichtscontrollers enthält und separat ein Fenster mit einer Platzhalteransicht, um sie hinzuzufügen. Der Platzhalter hat Einschränkungen in Bezug auf seine Superansicht und andere Ansichten im Fenster, und bevor ich meinen View-Controller verwende, ändere ich die Größe des Platzhalters mit dem Fenster, wie ich es möchte. Später lade ich die Schreibfeder und füge ihre Top-Level-Ansicht als Unteransicht des Platzhalters hinzu, und ich erstelle auch manuell Abhängigkeiten, um sie an den Kanten des Platzhalters auszurichten.Autolayout verkleinert mein Fenster

Alles gut, und ich verwende dieses Muster in mehreren Instanzen innerhalb meiner App, aber in einigen dieser Fälle, nach Hinzufügen der Ansicht wird mein Fenster in der Größe geändert! Es wird auf die minimale Größe für die hinzugefügte Ansicht verkleinert, anstatt dass die Ansicht auf die aktuelle Größe des Fensters erweitert wird.

Bis jetzt habe ich die einzige Möglichkeit gefunden, dies zu verhindern, indem ich beim Hinzufügen der Ansicht und beim Erstellen ihrer Integritätsbedingungen den Rahmen der Ansicht auf die Anfangsgröße für den aktuellen Status des Platzhalters und Fensters festlegt. Das ist manchmal ok, aber ich möchte in der Lage sein, komplexere Einschränkungen zu definieren, die einfach jede Kante mit einem Platzhalter-Superview ausrichten. Ich möchte die Rahmenarithmetik nicht für jeden dieser Fälle codieren.

Weiß jemand, was los ist? Wenn das Fenster bereits die Größe meines Platzhalters diktiert und nicht umgekehrt, was muss ich tun, wenn ich die Unteransicht hinzufüge, damit die aktuelle Fenstergröße immer noch Vorrang hat?

Ich habe das Pop-up-Menü in Xcode IB-Fenster gesehen, die Einschränkungen betreffen, die nur Subviews vs auch Superview betreffen (für alle meine Nibs auf den vorherigen eingestellt), was passiert im Zusammenhang mit dieser Funktionalität? Darüber habe ich noch nichts gefunden.

+0

Kann nicht festgelegt Sie nur eine Breite Einschränkung für die benutzerdefinierte Ansicht (Platzhalter) einstellen kann? – codingFriend1

+1

Hat meine Post bearbeitet, um das klarer zu machen, hoffe ich. Mein Platzhalter verfügt bereits über Einschränkungen, um bei der Größenänderung des Fensters das richtige Verhalten zu erzielen. Das Hinzufügen von festen Größenbeschränkungen beim Hinzufügen der Unteransicht würde dies zerstören. –

+0

Wenn Ihre Einschränkungen korrekt sind, dann würde die Größenänderung des Fensters funktionieren. –

Antwort

9

Sie möchten die Komprimierungswiderstandspriorität auf etwas kleiner als NSLayoutPriorityWindowSizeStayPut setzen, also 500. Dies bedeutet, dass die Größe des Fensters Vorrang vor der Größe der Ansicht hat.

Sie können dies über den IB-Größeninspektor festlegen.

Compression resistance priority

Oder Sie es programmatisch mit -[NSView setContentCompressionResistancePriority:forOrientation:]

+0

Es klingt richtig, dass dies ein vorrangiges Problem ist. In dem Fall, in dem diese Nachricht angezeigt wurde, war das Fenster jedoch größer als die Summe der hinzugefügten Unteransicht. Die Unteransicht wäre nicht komprimiert, sondern expandiert worden (das Problem war, dass sie nicht expandierte, sondern das Fenster geschrumpft wurde). Bedeutet dies, dass die Priorität der Kompressionswiderstände nicht ins Spiel kommt? Muss die Content Hugging-Priorität stattdessen auch auf <500 gesetzt werden, oder bin ich verwirrt? (Ich arbeite seit fast einem Jahr mit Auto-Layout und es fällt mir immer noch schwer, den Zweck dieser zwei Prioritäten zu visualisieren). –

+0

Ja, Sie haben Recht, die Priorität für den Inhalt sollte <500 sein.Die Komprimierungswiderstandspriorität wird verwendet, wenn herausgearbeitet wird, welche Ansicht verkleinert werden sollte, wenn der Platz reduziert wird, und inhaltlich umarmt wird, wenn der Platz vergrößert wird. Wenn das Fenster die Priorität 500 hat, dann bedeutet alles <500, dass die Fenstergröße gewinnt,> 500 die Ansicht gewinnt – iain

Verwandte Themen