2013-05-30 9 views
0

J'ai donc un UICollectionView en utilisant une mise en page personnalisée. J'utilise prepareLayout pour configurer les attributs, mais maintenant mon ensemble de données a augmenté et extrait les informations d'une base de données. Il y a potentiellement des millions d'éléments - évidemment je ne peux pas stocker les attributs pour autant (ça plante en fait à cause de la mémoire) problèmes).UICollectionViewLayout pour potentiellement des millions d'articles

Je ai chaluté SO & les Apple Docs pour des exemples comme le mien qui utilisent des dispositions personnalisées, mais ils préchargent tous les informations de mise en page. Si quelqu'un peut me aider avec la façon dont je mettre en œuvre les méthodes ci-dessous, je serais reconnaissant -

-(void)prepareLayout // does this actually need to do anything in my case? 
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect // how do I calculate this on the fly? 

Merci pour tous les pointeurs.

Répondre

0

C'est probablement évident pour la plupart d'entre vous, mais il m'a fallu un peu de temps pour le comprendre. PrepareLayout ne fait rien si vous ne le remplacez pas - dans mon cas ici, comme je ne veux pas précharger toutes les informations de mise en page pour des milliers de cellules, je ne le remplace pas.

Ma mise en œuvre de layoutAttributesForElementsInRect: est ici -

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray *allAttributes = [NSMutableArray array]; 

    NSInteger startItem = MAX(0, (NSInteger)(rect.origin.y/self.cellHeight) * kDaysInWeek);  
    NSInteger endItem = MIN(kNumDaysInCalendar, startItem + (NSInteger)((rect.size.height/self.cellHeight + 1)) * kDaysInWeek); 

    for (int i = startItem; i < endItem; i++) 
    { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; 
     UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
     layoutAttributes.frame = [self frameForCellAtIndexPath:indexPath]; 

     [allAttributes addObject:layoutAttributes]; 
    } 

    return allAttributes; 
} 

j'ai réalisé que cette méthode est appelée pour chaque nouvel écran complet, le rect passé est la fenêtre sur le contenu visible, donc tout ce que je devais faire était pour retourner un tableau des attributs pour chaque élément qui serait dans ce rect - J'ai une autre méthode, frameForCellAtIndexPath:, qui calcule le cadre pour une cellule à un indexPath donné.

Maintenant, il fonctionne parfaitement sans préchargement de mémoire-hogging.

Questions connexes