Ich habe eine NSCollectionView
, die eine Sammlung von CustomViews
enthält. Anfangs wurden die Unteransichten wie ein Gitter in Spalten und Zeilen gekachelt. Ich habe dann die Eigenschaft Columns
in IB auf 1 gesetzt, so dass sie nun nacheinander in Zeilen angezeigt wird. Obwohl mein CustomView
400 Pixel breit ist, ist es auf Autoresize gesetzt, NSCollectionView
ist 400 Pixel breit und es ist auf 1 Spalte gesetzt, die Subviews werden etwa 80 Pixel breit gezeichnet.
Ich weiß, dass ich das umgehen kann, indem ich anrufe:
%Vor% Aber wenn ich diesen Code in die awakeFromNib
-Methode meines WindowController
setze, wird beim Start des Programms nur die richtige Breite eingestellt. Wenn ich die Größe des Fensters ändere (und die NSCollectionView
Autoresizes, wie ich es spezifiziert habe), bleiben die CustomViews auf der ursprünglich eingestellten Breite.
Ich bin froh, wenn ich die Größe der Unteransichten anpassen kann, wenn es sein muss, aber ich bin ziemlich neu in Cocoa und finde keine Artikel, die erklären, wie man so etwas macht. Kann mir jemand in die richtige Richtung zeigen?
Anthony
Matt Gallaghers wundervoller Blog Cocoa with Love ist über , um das Problem anzugehen. In dieser Woche teilte er die Bindungsdetails einer einspaltigen Ansicht wie die fragliche:
Nächster Eintrag, er verspricht, den Rest der Implementierung zu teilen, die Ihnen geben sollte, was Sie suchen.
(Ich sollte beachten, dass er NSView direkt subklassifiziert und viele der NSCollectionView-Funktionen neu implementiert. Dies scheint jedoch üblich zu sein; nicht viele Leute mögen es, NSCollectionView zu unterklassifizieren.)
Bearbeiten: Scheint er hat sein Versprechen gebrochen ... wir haben diesen Post nie erhalten. Siehe unten Tofutims Antwort.
Ich weiß, das ist eine sehr späte Antwort, aber ich habe das gleiche Problem und hoffe, dass meine Lösung jemandem helfen wird. Die Lösung besteht darin, auf die Grenzen der umschließenden Bildlaufansicht und nicht auf die Sammlungsansicht selbst zuzugreifen. Um es zu lösen, müssen Sie die erste Zeile durch ersetzen:
%Vor%Ich konnte das mit einem Standardlayout nicht schaffen - aber es ist ziemlich einfach, ein benutzerdefiniertes Layout zu implementieren:
%Vor%Dann brauchst du nur
%Vor% noch ein später - Ich habe gerade einen NSTableView
verwendet und einen NSView
mit der Methode delegate
bereitgestellt.
Die Autoresierung ist kostenlos, eine Spalte ist einfach und sie rendert massiv schneller.
Nehmen wir an, Sie möchten Ihr CollectionViewItem mit einer Größe von 200x180px, dann sollten Sie folgendes einstellen:
%Vor%Deine Max-Size sollte groß genug sein, um gut auszusehen und genug Platz für das Stretching zu geben, damit es der collectionView-Width entspricht.
Wenn Sie eine feste Anzahl von Spalten haben, können Sie wahrscheinlich (0,0) verwenden, aber wenn Sie eine dynamische Anzahl von Zeilen und Spalten haben möchten, wie ich wollte .. sollten Sie eine feste Mindestgröße und eine größere max .size.
Sie können zwar eine Sammlungsansicht aufrufen, um sich so zu verhalten, wie Sie möchten, aber ich denke, Sie haben ein Designproblem
Sie sollten NSTableView
verwenden und die Spalten auf 1 und ihre Größe auf alles außer "None" setzen. NSTableView
ist für tabellarische Daten gedacht, und es kann Zellen recyceln, was eine große Leistungssteigerung für eine große Anzahl von Elementen bringt. NSCollectionView
ist eher ein lineares Layout, das Elemente in einem Raster mit vertikalem Scrollen anordnet. Dies ist nützlich, wenn sich die Spaltennummer dynamisch ändern kann, damit mehr Elemente auf dem Bildschirm angezeigt werden können, normalerweise abhängig von der Geräteausrichtung und der Bildschirmgröße.
Tags und Links cocoa interface-builder nscollectionview