2010-11-18 7 views
2

Ich benutze die Methode, die Apple zeigt mit Subviews in der Tabelle (die meisten, was unten ist, ist aus ihrer Dokumentation). Ich ziehe nur über einen RSS-Feed ungefähr 12 Bilder ein, aber das führt zu langsamem Scrollen - wenn ich die Bilder loslasse, bewegt es sich gleichmäßig. Die Bilder sind nicht groß, das kann nicht das Problem sein. Bevor ich mich mit komplexeren Lösungen (Hintergrundverarbeitung usw.) auseinandersetze, kann ich etwas tun, um diese Arbeit besser zu machen?Jerky Scrollen mit nur wenigen Bildern

Vielen Dank für jede Hilfe, die Sie dazu geben können.

#define MAINLABEL_TAG 1 
#define SECONDLABEL_TAG 2 
#define PHOTO_TAG  3 

-(UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath { 
    UILabel * mainLabel, * secondLabel; 
    UIImageView * photo; 
    static NSString * CellIdentifier = @ "Cell"; 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100.0, 0.0, 210.0, 0.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont systemFontOfSize:14.0]; 
     mainLabel.textAlignment = UITextAlignmentRight; 
     mainLabel.textColor = [UIColor blackColor]; 
     mainLabel.opaque = YES; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : mainLabel]; 

     secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(90.0, 30.0, 220.0, 0.0)] autorelease]; 
     secondLabel.tag = SECONDLABEL_TAG; 
     secondLabel.font = [UIFont systemFontOfSize:12.0]; 
     secondLabel.textAlignment = UITextAlignmentRight; 
     secondLabel.textColor = [UIColor darkGrayColor]; 
     secondLabel.opaque = YES; 
     secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : secondLabel]; 

     photo = [[[UIImageView alloc] initWithFrame:CGRectMake(30.0, 3.0, 50.0, 40.0)] autorelease]; 
     photo.tag = PHOTO_TAG; 
     photo.opaque = YES; 
     photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : photo]; 
    } else { 
     mainLabel = (UILabel *)[cell.contentView viewWithTag : MAINLABEL_TAG]; 
     secondLabel = (UILabel *)[cell.contentView viewWithTag : SECONDLABEL_TAG]; 
     photo = (UIImageView *)[cell.contentView viewWithTag : PHOTO_TAG]; 
    } 
    // Configure the cell. 
    mainLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "title"]; 
    secondLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "teacher"]; 
    NSString * path = [[items objectAtIndex:indexPath.row] objectForKey:@ "audimage"]; 
    NSString * mypath = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    NSURL * url = [NSURL URLWithString:mypath]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 
    UIImage * img = [[UIImage alloc] initWithData:data]; 
    photo.image = img; 
    return cell; 
    [cell release]; 
} 
+0

'[Zelle release];' nie – vikingosegundo

Antwort

1

Es ist wie jedes Mal sieht man eine Zelle gerade konfigurieren, können Sie das gesamte Bild aus dem Internet erneut herunterladen (oder von der Festplatte lesen, wo Punkte URL wenn das zu):

NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img = [[UIImage alloc] initWithData:data]; 

Das ist wirklich langsam! Die Art und Weise, wie UITableView funktioniert, besteht in der Wiederverwendung von Zellen - jedes Mal, wenn eine Zelle aus dem Bildschirm verschwindet, kann sie an die cellForRowAtIndexPath-Methode zurückgegeben werden, um als nächste Zelle verwendet zu werden, die sichtbar wird.

Dies bedeutet, dass alle Zeit eine neue Zelle sichtbar wird, Sie herunterladen und erstellen Sie ihr Bild.

Stattdessen haben Sie zwei Möglichkeiten:

  1. herunterladen und speichern alle Bilder zuerst (wenn es nur 12 sind, wird es wahrscheinlich nicht zu viel Speicherplatz verbrauchen).

  2. Laden Sie die Bilder bei Bedarf herunter, und wenn Sie eine Speicherwarnung erhalten, speichern Sie einige der zwischengespeicherten Bilder. Dies ist ein wenig schwieriger zu implementieren, also würde ich zuerst die erste Lösung versuchen.

+0

Hmm..thanks..I erreicht wird bei einem Verfahren nach der Rückkehr, als nichts genannt wurde von that..so Denken kein Caching mit los ist die Bilder so, dass sie im Gedächtnis bleiben, wenn das Bild von der Ansicht wegrollt? – Allen

+0

@Allen, nein - weil die Zelle, die von der Ansicht scrollt, dann ein neues Bild zugewiesen bekommt, so dass sie ihr altes verliert. –

+0

oh ... so ist es jetzt so herum wie das Überprüfen, um zu sehen, ob es das Bild verliert, dann nur dann gehen und das Bild wieder .. wie wenn Foto, Bild ist Null, das Bild wieder zu bekommen. Sorry, wenn das nicht sinnvoll ist, nur versuchen, etwas einfaches zu finden Wenn das überhaupt möglich ist) – Allen

Verwandte Themen