Ich habe in den letzten Tagen verschiedene Szenarien durchgespielt, und ich wage zu sagen, dass die Verwendung einer NSScrollView, oder nicht, praktisch keinen Unterschied macht. Mit oder ohne scrollView habe ich die gleichen Fehler und Einschränkungen bekommen.
Was macht einen großen Unterschied ist die Wahl zwischen "Old School" und der New-Fangled CollectionView. Mit dem „alten Schule“ ich die itemPrototype und Inhalt Eigenschaften bedeuten, Einstellung, etwas wie folgt aus:
NSCollectionView *collectionView = [[NSCollectionView alloc] init];
collectionView.itemPrototype = [TBCollectionViewItem new];
collectionView.content = self.collectionItems;
NSInteger index = 0;
for (NSString *title in _collectionItems) {
NSIndexPath *path = [NSIndexPath indexPathForItem:index inSection:0];
TBCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"Test" forIndexPath:path];
item.representedObject = title;
index++;
}
// Plays well with constraints
Neue Schule, etwas in dieser Richtung:
NSCollectionView *collectionView = [[NSCollectionView alloc] init];
collectionView.identifier = TBCollectionViewIdentifier;
[collectionView registerClass:[TBCollectionViewItem class] forItemWithIdentifier:TBCollectionViewItemIdentifier]; //register before makeItemWithIdentifier:forIndexPath: is called.
TBCollectionViewGridLayout *gridLayout = [TBCollectionViewGridLayout collectionViewGridLayout:NSMakeSize(250, 100)]; //getting the contentSize from the scrollView does not help
collectionView.collectionViewLayout = gridLayout;
collectionView.dataSource = self;
Nun, haben Sie den Kommentar bemerkt, dass register : muss vor makeItemWithIdentifier: forIndexPath aufgerufen werden. In der Praxis bedeutet dies, dass Sie registerClass aufrufen müssen, bevor Sie .dataSource setzen, während Sie in Ihrem Code zuerst .dataSource setzen. Der Status des Dokuments:
Obwohl Sie jederzeit neue Elemente registrieren können, dürfen Sie die Methode makeItemWithIdentifier: forIndexPath: erst aufrufen, nachdem Sie das entsprechende Element registriert haben.
Ich wünschte, ich könnte sagen, dass durch das Umschalten dieser beiden Linien alle Layout-Probleme gelöst werden. Leider habe ich festgestellt, dass die .collectionViewLayout/.dataSource-Kombination ein Rezept für (Auto) Layout-Katastrophe ist. Ob das durch den Wechsel von NSCollectionViewGridLayout zu flowLayout behoben werden kann, bin ich noch nicht sicher.
versuchen Sie, von der GridLayout auf die neue zu ändern (ich vergesse, wie es heißt). Grid-Layout ist das alte Layout. – pickwick
'NSCollectionViewGridLayout' ist in 10.11 mit der neuen Datenquellenmethode verfügbar, also sollte es funktionieren. Versucht, es in 'NSCollectionViewFlowLayout' zu ändern, und es hat leider immer noch nicht' itemForRepresentedObjectAtIndexPath' aufgerufen. – kevinlindkvist