2012-11-05 10 views
18

Wie auch immer in UICollectionView hacken, WillDisplayCell Delegate-Methode aufrufen, wenn Zelle angezeigt wird?UICollectionView WillDisplayCell Delegate-Methode?

Ich brauche das für verzögertes Laden, und ich tue es schön mit UITableView, aber offiziell UICollectionView nicht über diese Art von Delegatmethode.

Also, irgendwelche Ideen? Vielen Dank!

+4

Nur aus Neugier: Warum ist dequeueReusableCellWithReuseIdentifier: forIndexPath: nicht ausreichend? Ist das nicht schon faul? Ich dachte, dass die Zelle direkt nach dieser Methode angezeigt wird. – Masa

+1

@Masa ist es "Art" Lazy Loading, aber stellen Sie sich vor, Sie hatten ein Vollbild bei 2208x1242 Pixel und Sie wollten nur eine HTTP-Verbindung zum sichtbaren Bild zulassen. 'cellForItemAtIndexPath' würde mehrere Male ausgelöst werden, es ist im Grunde Prefetching, nicht Lazy Loading. Zu Ihrer Information: dieser Delegat ist in ios8 https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UICollectionViewDelegate_protocol/index.html#//apple_ref/occ/intfm/UICollectionViewDelegate/collectionView:willDisplayCell:forItemAtIndexPath zur Verfügung: –

Antwort

10

FYI, Dies hat zur API für iOS hinzugefügt 8:

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0); 
+3

erreicht hat Offizielle Dokumentation ist sehr verwirrend. Sehen Sie, was sie unter Diskussion sagen 'Diskussion Die Sammlungsansicht ruft diese Methode vor dem Hinzufügen einer Zelle zu seinem Inhalt. Verwenden Sie diese Methode, um Zellhinzufügungen zu erkennen, anstatt die Zelle selbst zu überwachen, um zu sehen, wann sie erscheint. Warten Sie, was? Es wird also nicht auf WillDisplay gemeldet? –

+0

Dies kann verwendet werden, um eine Zelle vor der Anzeige auf iOS 8+ einzurichten. Es wird nicht auf iOS 7 und früher aufgerufen. – buildsucceeded

0

Ich mache so etwas wie dies in cellForItemAtIndexPath: (für verzögertes Laden Bilder):

  • Wenn mein Modell das Bild hat, nur das Bild der Zelle gesetzt, um es
  • Wenn das Modell nicht über eine Bild, Tritt einer asynchronen Last
  • Wenn der Ladevorgang abgeschlossen ist, überprüfen Sie, ob der ursprüngliche IndexPath noch sichtbar ist
  • Wenn ja, rufen Sie cellForItemAtIndexPath für den ursprünglichen IndexPath. Da das Bild jetzt im Modell vorhanden ist, wird das Bild der Zelle jetzt festgelegt.

sieht wie folgt aus:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    PhotoCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath]; 
id imageItem = [self.photoSet objectAtIndex:indexPath.row]; 
     ImageManager * listingImage = (ImageManager *)imageItem; 
     if(listingImage.image){ 
      cell.image = listingImage.image; 
     } else { 
      [listingImage loadImage:^(UIImage *image) { 
       [collectionView reloadItemsAtIndexPaths:@[indexPath]]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        if ([[collectionView indexPathsForVisibleItems] containsObject:indexPath]) { 
         [(PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath] setImage:image]; 
        } 
       }); 
      }]; 
     } 
    } 

    return cell; 
} 
0

Sie Gebrauch von SDWebImagehttps://github.com/rs/SDWebImage für verzögertes Laden machen. Sie können dies effektiv mit UICollectionView verwenden.


- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

/*--------- 
----Other CollectiveView stuffs------ 
-----------------*/ 
if([[NSFileManager defaultManager] fileExistsAtPath:YOUR_FILE_PATH isDirectory:NO]) 
{ 
     imagView.image=[UIImage imageWithContentsOfFile:YOUR_FILE_PATH]; 
} 
else 
{ 
    UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [imagView addSubview:act]; 
    act.center=CGPointMake(imagView.frame.size.width/2, imagView.frame.size.height/2); 
    [act startAnimating]; 

    __weak typeof(UIImageView) *weakImgView = imagView; 
    [imagView setImageWithURL:[NSURL URLWithString:REMOTE_FILE_PATH] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){ 
    for(UIView *dd in weakImgView.subviews) 
    { 
     if([dd isKindOfClass:[UIActivityIndicatorView class]]) 
     { 
      UIActivityIndicatorView *act=(UIActivityIndicatorView *)dd; 
      [act stopAnimating]; 
      [act removeFromSuperview]; 
     } 
    } 
    NSString *extension=[YOUR_FILE_PATH pathExtension]; 

    [self saveImage:image withFileName:YOUR_FILE_PATH ofType:extension]; 
    }]; 
} 
} 
0

Ich habe eine ähnliche Situation, wenn ich den Index Weg der Zelle müssen wissen, die angezeigt werden sollen. Beendet mit - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath. Vermutlich ist einer "didEndDisplaying", ein anderer ist "willDisplayed".

+1

Eigentlich ist es ganz anders. WillDisplayCell wird ausgelöst, unmittelbar bevor die Zelle gerendert wird, um auf dem Bildschirm angezeigt zu werden. didEndDisplayingCell wird genau in dem Moment ausgelöst, wenn die Zelle für den Bildschirm verschwindet. Das heißt, wenn Sie didEndDiplayingCell verwenden, können Sie keinen unendlichen Scroll durchführen, indem Sie die letzte Zelle erkennen, da der Benutzer sie anzeigen müsste Scrollen Sie gerade hoch, damit es verschwindet, damit neue Elemente geladen werden können. Nicht wirklich benutzerfreundlich, oder? – CyberDandy

+0

Ich wechselte zu Methoden wie Erkennung, ob UIScrollView den Boden – BabyPanda

Verwandte Themen