Ho una vista tabella con immagini grandi che riempiono le celle e le altezze delle righe sono impostate in base alla dimensione dell'immagine. Sfortunatamente, la tabella si muove male quando si scorre alla cella successiva.Come posso memorizzare qualcosa per una vista tabella?
Mi è stato detto che il mio tableview scorrerà più facilmente se memorizzo nella cache l'altezza delle righe e le immagini prima che vengano caricate nella tabella. Tutti i miei dati sono memorizzati in un plist.
Come faccio a memorizzare qualcosa nella cache? Che aspetto ha il codice e dove va?
Grazie!
Ecco il mio codice per il caricamento delle immagini:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *detailTableViewCellIdentifier = @"Cell";
DetailTableViewCell *cell = (DetailTableViewCell *)
[tableView dequeueReusableCellWithIdentifier:detailTableViewCellIdentifier];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DetailTableViewCell" owner:self options:nil];
for(id currentObject in nib)
{
cell = (DetailTableViewCell *)currentObject;
}
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *MainImagePath = [Path stringByAppendingPathComponent:([[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainImage"])];
cell.mainImage.image = [UIImage imageWithContentsOfFile:MainImagePath];
return cell;
}
Sto anche utilizzando la seguente per calcolare l'altezza della riga:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
AppDelegate *appDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *MainImagePath = [Path stringByAppendingPathComponent:([[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainImage"])];
UIImage *imageForHeight = [UIImage imageWithContentsOfFile:MainImagePath];
imageHeight = CGImageGetHeight(imageForHeight.CGImage);
return imageHeight;
}
EDIT: Ecco il codice finale di seguito.
#define PHOTO_TAG 1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Photo";
UIImageView *photo;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
UIImage *theImage = [UIImage imageNamed:[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainImage"]];
imageHeight = CGImageGetHeight(theImage.CGImage);
imageWidth = CGImageGetWidth(theImage.CGImage);
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
photo = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, imageWidth, imageHeight)] autorelease];
photo.tag = PHOTO_TAG;
[cell addSubview:photo];
} else {
photo = (UIImageView *) [cell viewWithTag:PHOTO_TAG];
[photo setFrame:CGRectMake(0, 0, imageWidth, imageHeight)];
}
photo.image = theImage;
return cell;
}
Rob, Grazie per la risposta. Ho solo una vista per la cella e questa è una singola immagine. Ho avuto l'idea di mettere in cache le immagini di una domanda precedente che ho chiesto: http://stackoverflow.com/questions/1352479/tricks-for-improving-iphone-uitableview-scrolling-performance – Jonah
Ho aggiunto il codice sopra nel caso in cui sia presente Aiuto. Grazie! – Jonah
Le risposte di rpetrich sono buone. Per quanto riguarda il caching rowHeight, la soluzione più semplice consiste nel mantenere un array di NSNumbers che memorizzino l'altezza calcolata per ogni riga. Puoi iniziare facendo in modo che siano tutti 0 e, se è 0, lo calcoli e memorizzi il risultato nell'array. Se non è zero, lo restituisci. Fai un po 'di profilazione, però, in Strumenti e dai un'occhiata a dove stai * davvero * spendendo il tuo tempo prima di fare troppe modifiche casuali. I calcoli dell'altezza della riga possono essere l'ultimo dei tuoi problemi. Forse stai ridimensionando troppo le immagini (sembra probabile). Strumenti aiuteranno. –