2016-07-13 4 views
0
if (cell.tag == indexPath.row) { 
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:[enclosureUrlArray objectAtIndex:indexPath.row]] 
          placeholderImage:[UIImage imageNamed:@"placeholder"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; 
        CGSize itemSize = CGSizeMake(50, 50); 
        UIGraphicsBeginImageContext(itemSize); 
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
        [cell.imageView.layer setMasksToBounds:YES]; 
        [cell.imageView.layer setCornerRadius:2.5f]; 
        [cell.imageView.image drawInRect:imageRect]; 
        cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
        UIGraphicsEndImageContext(); 
        cell.imageView.autoresizingMask = UIViewAutoresizingNone; 
     } 

    return cell; 

Ich habe nur SDWebImage verwendet. Während ich scrolle, sind meine UITableView Zellen blockiert - es läuft nicht reibungslos. Ich lade Bilder von einem Webservice ab. Kannst du mich wissen lassen, warum das passiert?Kann ich wissen, warum die Tabellenansichtszelle beim Scrollen lazy wird?

+0

Bitte fügen Sie eine bessere Beschreibung Ihrer Frage/Problem. – TMob

+0

actualy, während im Scrollen seine Tabellenansicht Zellen zu stecken ist es nicht glatt. Das ist mein Problem. Der obige Code habe ich benutzt. Ich bekomme Bilder vom Webservice. – karthik

+1

Wo befinden sich die Bilder? Es sieht so aus, als ob du zu viel in der Zell-Methode arbeitest, weshalb es so aussieht, als ob es laggy wäre. – TMob

Antwort

0

In Ihrem Code wird beim Scrollen der Tabellenansicht ein Problem auftreten, da Sie nach dem Herunterladen des Bildes die Bildform ändern, z. B. das Anwenden von Bounds, Radius. So ändert sich die Bildform jedes Mal. Es wäre besser, keine Bibliothek von Drittanbietern zu verwenden, sondern stattdessen Apple-APIs zu verwenden.

Der folgende Code helfen könnten:

cell.imageView.image = nil; 
     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
     dispatch_async(queue, ^(void) { 

      NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:parsedData[@"imageLR"]]; 

      UIImage* image = [[UIImage alloc] initWithData:imageData]; 
      if (image) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (cell.tag == indexPath.row) { 
         cell.imageView.image = image; 
        CGSize itemSize = CGSizeMake(50, 50); 
        UIGraphicsBeginImageContext(itemSize); 
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
        [cell.imageView.layer setMasksToBounds:YES]; 
        [cell.imageView.layer setCornerRadius:2.5f]; 
        [cell.imageView.image drawInRect:imageRect]; 
        cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
        UIGraphicsEndImageContext(); 
        cell.imageView.autoresizingMask = UIViewAutoresizingNone; 
         [cell setNeedsLayout]; 
        } 
       }); 
      } 
     }); 
0

Wenn Sie Ihre Tabellenansicht wollen buttrig-glatt zu bewegen, empfehle ich Ihnen Session 211 von WWDC 2012 beobachten, Concurrent User Interfaces Der Aufbau und die Konzepte dort anzuwenden. Dies beinhaltet Zellen, deren Inhalt unabhängig abgefragt und gerendert wird.

Das Grundkonzept lautet wie folgt:
1. In tableView: cellForRowAtIndexPath wird eine Zelle instanziiert.
2. In derselben Methode wird eine Operation zum Abrufen der Daten zum Auffüllen der Zelle erstellt und in einem Wörterbuch gespeichert. Ein Verweis auf die Zelle wird an die Operation übergeben. Die Operation verfügt über einen Beendigungshandler, der die Zelle auffüllt und die Operation aus dem Wörterbuch entfernt.
3. Bevor die Zelle von der Methode zurückgegeben wird, wird die Operation einer Operationswarteschlange hinzugefügt.
4. In tableView: didEndDisplayingCell: forRowAtIndexPath werden Vorgänge für Zellen, die sich außerhalb des Bildschirms befinden, abgebrochen und aus dem Wörterbuch entfernt.

Verwandte Themen