2015-05-19 5 views
5

Ich bin neu in der Kakaoentwicklung von OS X und arbeite an einer Swift App mit Storyboards für Yosemite.Wie wird die minimale und anfängliche Breite der NSSplitView-Panels mithilfe des automatischen Layouts festgelegt?

Im Hauptfenster meiner Anwendung habe ich einen NSSplitViewController. Für jedes der Felder, links und rechts, habe ich eine benutzerdefinierte Root-Ansicht hinzugefügt, die alle Unteransichten enthält.

Storyboard Layout

Auto-Layout verwenden, ich habe die benutzerdefinierte Ansicht auf die Kanten der Ansicht im Split View gemerkt und habe festgelegt, auch eine Einschränkung für die Breite der benutzerdefinierten Ansicht, dass sie größer als oder gleich zu einem Mindestanzahl

Autolayout Constraints

Das alles funktioniert gut. Wenn das Fenster geöffnet wird, ist die Fensterbreite die Summe der minimalen Breitenbeschränkungen der zwei Bereiche. Was ich nicht herausfinden kann, ist der nächste Schritt.

Wie gebe ich Custom View eine weitere Width Constraint ein, so dass beim Öffnen des Fensters die anfängliche Breite höher ist als das Minimum (sagen wir 300)? Was ich will ist, dass das Panel so klein wie 200 sein kann, aber ich möchte die anfängliche Größe 300 sein. Ich möchte nicht, dass sich das Fenster mit der kleinsten erlaubten Breite öffnet. Dann muss der Benutzer die Größe jedes Mal ändern, und das wäre keine gute Benutzererfahrung.

Um dies zu erreichen, fügte ich eine weitere Width - Einschränkung für 300 mit einer niedrigeren Priorität (Erprobung aller verschiedenen Werte 200, 500, 800 usw.) zur benutzerdefinierten Ansicht hinzu, aber keine von ihnen gibt mir das gewünschte Ergebnis Breitenwert ist 300 und die Platte eine Breite von mindestens 200.

Revised Autolayout constraints

es eine Möglichkeit, dies zu erreichen, hat sein zu müssen, aber ich bin einfach ratlos, wie. Bitte helfen Sie!

aktualisiert

Hier die Ausgabe von constraintsAffectingLayoutForOrientation ist für die Ansicht des NSSplitViewController:

<NSLayoutConstraint:0x6000000923e0 H:|-(0)-[NSView:0x600000124c40] (Names: '|':NSView:0x600000124ba0)>, 
<NSLayoutConstraint:0x6000000924d0 H:[NSView:0x600000124c40]-(0)-| (Names: '|':NSView:0x600000124ba0)>, 
<NSLayoutConstraint:0x600000092070 H:[NSView:0x600000124c40(>=200)]>, 
<NSLayoutConstraint:0x600000092660 _NSSplitViewItemViewWrapper:0x6000001416b0.width == NSView:0x600000124ba0.width>, 
<NSLayoutConstraint:0x600000093a10 H:|-(0)-[_NSSplitViewItemViewWrapper:0x6000001416b0](LTR) (Names: '|':NSSplitView:0x608000123b60)>, 
<NSLayoutConstraint:0x600000093b50 H:[_NSSplitViewItemViewWrapper:0x6000001416b0]-(1)-[_NSSplitViewItemViewWrapper:0x6000001429f0](LTR)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093d80 h=-&- v=-&- H:[NSSplitView:0x608000123b60]-(0)-| (Names: '|':NSView:0x6000001242e0)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093b00 h=-&- v=-&- H:|-(0)-[NSSplitView:0x608000123b60] (Names: '|':NSView:0x6000001242e0)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000094050 h=-&- v=-&- H:|-(0)-[NSView:0x6000001242e0] (Names: '|':NSThemeFrame:0x100940be0'Main Window')>, 
<NSLayoutConstraint:0x600000093c40 H:[_NSSplitViewItemViewWrapper:0x6000001429f0]-(0)-|(LTR) (Names: '|':NSSplitView:0x608000123b60)>, 
<NSLayoutConstraint:0x600000092890 H:[NSView:0x600000124f60]-(0)-| (Names: '|':NSView:0x600000124ec0)>, 
<NSLayoutConstraint:0x6000000926b0 H:[NSView:0x600000124f60(>=400)]>, 
<NSLayoutConstraint:0x608000099d20 _NSSplitViewItemViewWrapper:0x6000001429f0.width == NSView:0x600000124ec0.width>, 
<NSLayoutConstraint:0x600000092840 H:|-(0)-[NSView:0x600000124f60] (Names: '|':NSView:0x600000124ec0)>] 

Aufgrund der großen Anzahl von Einschränkungen zu sortieren, entschied ich mich ein ganz neues Testprojekt zu machen und Sehen Sie, ob dies von Anfang an geschieht oder ob es sich um eine Einstellung handelt, die ich in meiner Anwendung geändert habe. Im Testprojekt habe ich gerade den View-Controller gelöscht, einen Split-View-Controller zum Fenster hinzugefügt und einfach zwei einfache Textansichten zu jedem Panel hinzugefügt. Nach dem Ausführen des Projekts wurde die linke Seitenabdeckung geschlossen. Also fügte ich jeder Textansicht eine Mindestbreite hinzu und dann passierte dasselbe im Testprojekt. Egal, was ich im Storyboard eingestellt habe, die Fenstergröße ist die Addition der Mindestbreiten. Vielleicht ist der einzige Weg, um darüber hinaus zu kommen, die Größe der Fenster/geteilten Ansicht im Code einzustellen.

Antwort

6

Sie sollten keine zusätzlichen Einschränkungen hinzufügen müssen, um dies zu erzwingen. Das Fenster hat standardmäßig die Größe, mit der es im Storyboard konfiguriert wurde. Wenn es kleiner wird, deutet das darauf hin, dass es Beschränkungen gibt, die es kleiner machen.

Ein Fenster behält seine Größe mit der Priorität 500 (NSLayoutPriorityWindowSizeStayPut). Einschränkungen höherer Priorität können zu einer anderen Größe drücken oder ziehen. Einschränkungen mit niedriger Priorität werden durch die aktuelle Größe des Fensters außer Kraft gesetzt.

Also sollten Sie nach Einschränkungen mit höherer Priorität als 500 suchen, die versuchen, es enger zu ziehen. Zum Beispiel, Inhalt umarmt Prioritäten der Kontrollen. Eine andere Möglichkeit ist die Haltepriorität der geteilten Ansichtselemente. Wenn diese Werte höher als 500 sind und die anfängliche Größe der vom Storyboard geladenen Ansichten das Minimum ist, dann erwarte ich, dass die geteilte Ansicht es vorzieht, sie bei diesen Größen stärker zu behalten, als das Fenster seine Größe behalten möchte.

Eine möglicherweise nützliche Diagnosetechnik ist die Protokollierung [someView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]. Sie können dies für das Fenster contentView oder die Split-Ansicht tun.

Verwandte Themen