2012-12-25 10 views
11

Ich habe SDWebImage (Ver3.0) auf meiner iOS App verwendet, und ich möchte das neue Bild von Uitableviewcell einblenden, sobald es wie Path2.0, Pinterest und Viddy geladen wird. Danke iOS SDWebImage fade in new image, funktioniert die Einblendung selbst. Allerdings wird das Bild in der Zelle beim Scrollen der Tabellenansicht erneut geladen. Dies kann durch eine Wiederverwendung einer Zelle verursacht werden.iOS SDWebImage Einblenden UITableViewCell

Hier ist mein Code.

[cell.userImageView setImageWithURL:url 
        placeholderImage:placeholderImage 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
           if (!error) { 
            cell.userImageView.alpha = 0.0; 
            [UIView transitionWithView:cell.userImageView 
                duration:1.0 
                options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^{ 
                 [cell.userImageView setImage:image]; 
                 cell.userImageView.alpha = 1.0; 
                } completion:NULL]; 
           } 
          }]; 
+0

Finden Sie heraus, ob SDWebImage zwischenspeichert - wenn ja, stellen Sie sicher, dass Sie nur nicht zwischengespeicherte Lasten animieren. – Till

+0

Danke! Caching ist abgeschlossen. Aber ich habe nicht überprüft, dass ich nur nicht zwischengespeicherte Lasten animiere ... – tsk

Antwort

25

Kredit geht an @OzBoz für den Hinweis auf, dass die richtige Lösung nur bestätigen, ob das Bild aus dem Netz abgerufen wurde (nicht zwischengespeichert), und wenn ja, führen Sie die Animation:

[cell.userImageView setImageWithURL:url 
        placeholderImage:placeholderImage 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
           if (image && cacheType == SDImageCacheTypeNone) 
           { 
            cell.userImageView.alpha = 0.0; 
            [UIView animateWithDuration:1.0 
                animations:^{ 
                 cell.userImageView.alpha = 1.0; 
                }]; 
           } 
          }]; 

wenn Sie über die Zelle besorgt sind nicht mehr sichtbar ist), können Sie auch:

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

Diese Methode (nicht vom gleichnamigen UITableViewDataSource Verfahren verwechselt werden) zurückkehren nicht nil wenn die Zeile noch sichtbar ist. Dies ist sehr wichtig in den meisten UITableViewCell asynchronen Image-Retrieval-Prozessen, aber es stellt sich heraus, dass setImageWithURL alle vorherigen Bilderfassungsprozesse abbrechen, so dass es weniger wichtig ist, dies zu überprüfen, wenn SDImageWeb verwendet wird.

+0

Danke !! Ihr Code funktioniert gut (Ich habe den UITableViewCell-Typ durch meine benutzerdefinierte Zellen-Unterklasse ersetzt) ​​!! Ich wusste nicht, dass ich überprüfen sollte, ob eine Zelle immer noch sichtbar ist, wenn die Zelle asynchron aktualisiert wird. Also habe ich viel gelernt. – tsk

+0

@Rob Ich bin nur neugierig, ich habe verwendet, wenn (CacheType == SDImageCacheTypeNone) anstelle von UITableView * Zelle = [TableView CellForRowAtIndexPath: IndexPath]; if (Zelle) für eine Zeit Animation nach dem Laden von Daten von http angezeigt. Nachdem ich Ihre if-Anweisung verwendet habe, konnte ich nicht herausfinden, warum die Zelle als Null kommt, wenn das Bild in der Zelle zuvor eingelöst wurde. – OzBoz

+0

@Rob Danke für die Antwort. Aber, noch ist etwas nicht klar. Logik hinter der Verwendung von 'cacheType == SDImageCacheTypeNone', um zu überprüfen, ob die Daten aus dem Web stammen, machen dann eine Animation. Wenn nicht, dann nicht, weil das zwischengespeicherte Bild sofort ohne Animation angezeigt werden sollte (wie Instagram-App). Die Sache, die ich nicht verstehen konnte, ist, warum Zelle null wird (Wiederbenutzung durch eine andere Zeile), wenn das Einstellungsbild für Bildansicht vorgeladen ist. Wenn ich die Verknüpfung des Bildes in der zweiten Zeile ändere, wird Zelle nicht Null. Warum ist das so? – OzBoz