Ich verwende eine UICollectionView mit einem benutzerdefinierten Layout, das Zellen in einem Rasterformat darstellt. Es kann weit über 50 Zeilen und 50 Spalten geben. Scrollen findet sowohl vertikal als auch horizontal statt. Derzeit bin ich das gesamte Layout-Setup in prepareLayout
tun und es in Arrays zu speichern:UICollectionView Sehr langsames benutzerdefiniertes Layout
- (void)prepareLayout {
NSMutableArray *newLayoutInfo = [[NSMutableArray alloc] init];
NSMutableArray *newLinearLayoutInfor = [[NSMutableArray alloc] init];
NSInteger sectionCount = [self.collectionView numberOfSections];
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];
self.heightForRows = [delegate collectionViewHeightForAllRows];
self.totalWidthsForRows = [[NSMutableArray alloc] init];
for (int i = 0; i < sectionCount; i++) {
[self.totalWidthsForRows addObject:[NSNumber numberWithInt:0]];
}
for (NSInteger section = 0; section < sectionCount; section++) {
NSMutableArray *cellLayoutInfo = [[NSMutableArray alloc] init];
NSInteger itemCount = [self.collectionView numberOfItemsInSection:section];
for (NSInteger item = 0; item < itemCount; item++) {
indexPath = [NSIndexPath indexPathForItem:item inSection:section];
UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
itemAttributes.frame = [self frameForCellAtIndexPath:indexPath];
[cellLayoutInfo addObject:itemAttributes];
[newLinearLayoutInfor addObject:itemAttributes];
}
[newLayoutInfo addObject:cellLayoutInfo];
}
self.layoutInfo = newLayoutInfo;
self.linearLayoutInfo = newLinearLayoutInfor;
}
Dann in layoutAttributesForElementsInRect
ich habe:
- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *rows = [self.linearLayoutInfo filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *evaluatedObject, NSDictionary *bindings) {
return CGRectIntersectsRect(rect, [evaluatedObject frame]);
}]];
Das funktioniert gut, aber es ist laggy und schreckhaft, wenn ich habe über 50 Spalten und 50 Zeilen. Das Problem, das ich jetzt habe, ist, dass ich
-(BOOL)shouldInvalidateLayoutForBoundsChange {
return YES;
}
Dies macht gesetzt muss das gesamte Layout jedes Mal die Grenzen Veränderung, die, unnötig zu sagen, hat einen großen Einfluss auf die Leistung vorbereiten und man kann kaum bewegen. Die Zellen bestehen nur aus Text mit einem undurchsichtigen Hintergrund, daher gibt es dort kein Problem.
Ich bin sicher, ich mache das nicht richtig und es muss einen besseren Weg geben. Danke für die Hilfe im Voraus.
Sie Instrumente verwenden sollten, um zu sehen, wo Sie Ihre Zeit verbringen während des Scrollens. – nielsbot
Ich empfehle, Elemente so anzuordnen, wie sie Ihrer Sammlungsansicht hinzugefügt werden. Keine Notwendigkeit, Elemente, die bereits vorhanden sind, anzuordnen - sie befinden sich an den richtigen Positionen. Wenn Sie es auf diese Weise tun, können Sie 'shouldInvalidateLayoutForBoundsChange' deaktivieren. – nielsbot
@nielsbot Ich habe ergänzende Ansichten, die als Kopfzeilen fungieren, die immer auf den Inhalts-Offset der Sammelansicht gesetzt werden müssen. Diese befinden sich oben und an der Seite der Ansicht. Wenn ich 'shouldInvalidateLayoutForBoundsChange' abwende," floaten "die Header nicht mehr dort, wo sie sollen. Gibt es dafür eine andere Lösung? –