Ich habe rund 14 Artikel in meiner SammlungView und das Scrollen ist überhaupt nicht glatt. Ich verwende automatisches Layout (meine Einschränkungen protokollieren keine Fehler) und ich verwende die Eigenschaft cornerRadius (es ist eine Messaging-App).UICollectionView Scroll-Leistung Horrible
Ich habe versucht zu analysieren es die Zeit Profiler Instrument, und das war, was ich sehe, wenn ich blättern:
Leider „in Xcode Reveal“ ausgegraut ist, so kann ich nicht Sehen Sie genau, welche Zeile für immer dauert. Ich berechne jedoch die Größe jedes Artikels. Ich frage mich, was die riesige 9377 ms Verzögerung sein könnte? Ich verwende keine geordneten Sets, wenn ich mich richtig erinnere.
Hier ist meine cellForItemAtIndexpath
Methode:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//Define Message
Message *message = (Message *)[self.messages objectAtIndex:indexPath.item];
//Check Message Type
switch (message.type) {
case MessageTypeText: {
//Initialize Cell
TextMessageItem *cell = (TextMessageItem *)[collectionView dequeueReusableCellWithReuseIdentifier:kTextMessageItemIdentifier forIndexPath:indexPath];
//Return Cell
return cell;
break;
}
}
return nil;
}
Hier ist, wie ich die Höhe bin Berechnung:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
//Retrieve the right message
Message *message = (Message *)[self.messages objectAtIndex:indexPath.row];
//Check Message Type
switch (message.type) {
case MessageTypeText: {
//Create a temporary cell to get the correct size
TextMessageItem *tempCell = [[TextMessageItem alloc] init];
//Configure the cell
[self collectionView:collectionView configureTextCell:tempCell atIndexPath:indexPath];
CGSize s = [tempCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize withHorizontalFittingPriority:UILayoutPriorityDefaultHigh verticalFittingPriority:UILayoutPriorityDefaultLow];
//Return Content Size
return CGSizeMake(self.collectionView.bounds.size.width, s.height);
break;
}
}
//Return
return CGSizeMake(0, 0);
}
Meine WillDisplayCell
Methode:
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
//Retrieve message from our array of messages
Message *message = (Message *)[self.messages objectAtIndex:indexPath.row];
//Check Message Type
switch (message.type) {
case MessageTypeText: {
//Cast Cell
TextMessageItem *textItem = (TextMessageItem *)cell;
[self collectionView:collectionView configureTextCell:textItem atIndexPath:indexPath];
break;
}
}
}
Und schließlich, das ist meine Gewohnheit configureTextCell
Methode:
- (void)collectionView:(UICollectionView *)collectionView configureTextCell:(TextMessageItem *)item atIndexPath:(NSIndexPath *)indexPath {
//Retrieve Message
Message *message = (Message *)[self.messages objectAtIndex:indexPath.item];
//Display Timestamp if Needed
[self displayTimestampForItemIfNeeded:item atIndex:indexPath.item];
//Update Top Message Padding Based On Who Sent The Previous Message
[self updateDistanceFromPreviousMessageForItem:item atIndex:indexPath.item];
//Display Delivery Status if Needed (e.g. Delivered)
[self displayDeliveryStatusForItemIfNeeded:item atIndex:indexPath.item];
//Set Message
[item setMessage:message];
}
Könnte es sein, dass mein 'cellForItemAtIndexpath' nicht korrekt implementiert ist? Meine 'UICollectionViewCell'-Unterklasse wird programmgesteuert ausgeführt (keine Storyboard- oder XIB-Dateien), und ich stelle fest, dass beim ersten Laden die' initWithFrame'-Methode für jedes Element in meinem self.messages-Array aufgerufen wird. Ist das normal? – KingPolygon