2014-01-08 5 views
5

Ich versuche, eine gestapelte Anordnung von einfachen NSViews zu erreichen, und dafür verwende ich eine NSCollectionView an einen Dictionary Controller gebunden. Das Ergebnis, das ich bisher habe, ist unten:NSCollectionView Auto-Resize Subview mit Auto-Layout

Normal

Die Etiketten auf der linken Seite auf den Controller-Element-Tasten und der SegmentedControl selectedIndex auf die Elementwerte gebunden sind.

Problem ist, ich habe keine Ahnung, wie die Unteransichten in NSCollectionView auf die Containerbreite zu erzwingen; was passiert ist, behalten sie ihre eigene Breite und wenn die NSCollectionView erscheint zu schmalen horizontalen Scrollbar wird, wie unten:

enter image description here

Ich bin mir dessen bewusst this question (und die „inverse“, this one), und ich Ich habe nie viel mit Autolayout gearbeitet, um ehrlich zu sein. Ich frage mich, mit all der Vorliebe, die AutoLayout mit sich bringt, gibt es eine Möglichkeit, mit diesem Problem umzugehen, ohne auf das Codieren und Verwenden von Ereignissen/Benachrichtigungen zurückzugreifen? (Ich verstehe, dass NSViewFrameDidChangeNotification Beobachtung ist eine Alternative, nicht wahr?)

Dank

+0

Konnten Sie das zur Arbeit bringen? Ich frage mich, ob es einen Weg gibt, es von IB zu machen. – tofutim

Antwort

1

Die Lösung ist sehr einfach: Wechseln Sie zu einem view-basierten NSTableView. ist nicht für den in der Frage beschriebenen Einsatz gedacht. Mit NSTableView erhalten Sie das Größenänderungsverhalten standardmäßig und kostenlos.

Es funktioniert auch, ob Sie Bindings oder Datasource verwenden, ist es nicht wirklich wichtig.

+0

funktioniert es auch mit der Höhe, nicht nur mit der Breite? – gaussblurinc

+0

nicht sicher, was Sie genau meinen? Könntest Du das erläutern? – insys

+0

Ich meine iOS 'self.tableView.rowHeight = UITableViewAutomaticDimension;'.Gibt es eine Alternative für Mac OS? – gaussblurinc

1

gerade tat etwas sehr ähnlich - mit Ausnahme einer NSSplitView Unterklasse verwenden - also, wenn ich Ihre Frage richtig verstanden würden Sie für das Setup Einschränkungen wollen Subviews zu den Seiten Ihres Super so befestigen:

NSDictionary * viewsDict = NSDictionaryOfVariableBindings(filler); 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filler]|" 
                  options:0 
                  metrics:nil 
                   views:viewsDict]]; 

Sie könnten auch mit dem Content Compression Resistance Priority Parameter Sie Subviews Geige die gewünschten Ergebnisse zu erzielen.

Beachten Sie auch, dass, wenn OS Targeting X 10.9 ausschließlich gibt es die neue NSStackView Klasse.

"NSStackView ist eine neue Klasse in OS X 10.9 Es wird verwendet, horizontale oder vertikale Stapel von Ansichten Layout mit Auto-Layout. Beim Hinzufügen und Entfernen von Sichten aus einer Stapelansicht werden die erforderlichen Abhängigkeiten automatisch erstellt und geändert, um ein zusammenhängendes Layout zu erhalten.

+1

Danke für die Antwort. Ich habe total vergessen zu erwähnen, dass ich Bindungen verwende (bearbeitete Frage), und das ist einer der Gründe, warum ich weiterhin NSCollectionView verwenden möchte (es ist wirklich einfach zu benutzen). Ich habe ein wenig mit der Inhaltskompressions-Widerstandspriorität gespielt und sie auf einen niedrigeren Wert (<500, wie beschrieben [hier]) gesetzt (http://stackoverflow.com/questions/15850417/cocoa-autolayout-content-hugging-vs-content) -compression-resistance-priority)), aber nichts hat sich geändert ... scheint es, dass für CollectionViews Kinder andere Regeln gelten? – insys

+0

Gibt es eine Möglichkeit, dies von IB einzurichten? – tofutim