2010-06-26 5 views
2

J'ai quelques grandes images dans un UITableView groupé. Il y a 1 rangée dans chaque section qui contient l'image et il y a un texte d'en-tête et de pied de page associé pour chaque section à propos de l'image. J'ai travaillé dur pour le faire défiler en douceur est iPhone OS 3.x et finalement réussi. Mais ... quand je suis passé à iOS 4, tout a changé. Maintenant, il y a des performances très saccadées chaque fois qu'une nouvelle cellule est chargée. Voici mon code cellForRowAtIndexPath:Performances du défilement Jittery dans UITableView après la mise à niveau d'iOS 4

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"CellIdentifier"; 

    UIImageView *photo; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    ApplicationDelegate *appDelegate = (ApplicationDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSString *fileName = [NSString stringWithFormat:@"%@",[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]]; 
    UIImage *theImage = [UIImage imageNamed:[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]]; 

    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, 320, (imageHeight*320)/imageWidth)] autorelease]; 
     photo.tag = PHOTO_TAG; 
     [cell addSubview:photo]; 
    } else { 
     photo = (UIImageView *) [cell viewWithTag:PHOTO_TAG]; 
     [photo setFrame:CGRectMake(0, 0, 320, (imageHeight*320)/imageWidth)]; 
    } 

    photo.image = theImage; 
    return cell; 
} 

Note: Je l'ai essayé d'utiliser le code suivant à la place de la méthode "imageNamed" sans succès:

UIImage *theImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,fileName]]; 

J'ai même essayé de pré-mise en cache les images mais sans succès. Toute aide serait grandement appréciée.

MISE À JOUR: J'ai essayé d'expérimenter avec l'aide de Grand Central Dispatch pour charger les images en créant une file d'attente d'image et de les charger de manière asynchrone:

dispatch_async(_image_queue, ^{ 
photoImageView.image = [imageCacheNS objectForKey:imageString];}); 

Le problème que je reçois est que les images chargent très lentement et lorsque je fais défiler la table, les images précédemment affichées sont affichées pendant quelques secondes jusqu'à ce que la nouvelle image soit chargée.

MISE À JOUR 2: Je n'ai toujours pas été en mesure de faire ce travail. J'étudie maintenant en utilisant la méthode drawRect pour dessiner la cellule. J'espère que cela améliorera les performances de défilement. L'exemple de code exemple # 5 de tableViewSuite d'Apple montre comment faire ceci, mais j'ai du mal à trouver comment le faire fonctionner pour mon projet. Quelqu'un a-t-il déjà utilisé drawRect pour charger des images dans un tableau?

Merci!

Répondre

0

Après une énorme quantité de travail et de nombreuses communications avec le support d'Apple, j'ai finalement obtenu ce travail. Je charge maintenant de très grandes images dans une vue de table en arrière-plan et j'ai des performances de défilement très rapides. Fondamentalement, j'ai suivi des parties du code de l'exemple de code WWDC 2010 "CoreAnimationImageBrowser".Il est conçu pour l'iPad et est basé sur un scrollView personnalisé au lieu d'un tableauView, mais la classe ImageScrollView est celle à utiliser pour charger vos images.

Ensuite, la chose vraiment étrange que je devais faire pour expliquer le fait que les cellules ne peuvent pas être préchargées dans un tableauView était d'ajouter les images sous-vues derrière la tableView. Au fur et à mesure que la table défile, les images sont déjà chargées et se chargent rapidement.

Sorte d'un hack bizarre, mais le Apple Tech semblait penser que c'était bien.

Bonne chance à tous ceux qui essaient de le faire. Il m'a fallu pas mal de temps pour le comprendre.

1

Essayez de charger l'image dans un autre fil. Cela aidera à améliorer la réactivité de votre vue de table (et d'autres éléments de l'interface utilisateur). C'est un endroit où les blocs et libdispatch seraient d'excellents ajouts à votre code.

+0

Souhaitez-vous élaborer? Je ne suis pas familier avec l'utilisation de blocs ou de libdispatch. Connaissez-vous des exemples où blocks et libdispatch sont utilisés dans UITableViews? Merci! – Jonah

+0

Voir ici: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html Aussi, si vous êtes un développeur Apple enregistré, vous pouvez télécharger la WWDC 2010 vidéos gratuites. Les blocs et les vidéos Grand Central Dispatch (libdispatch) sont fantastiques. –

+0

Merci pour l'aide. Je regarderai. – Jonah

1

L'exemple de code LazyTableImages d'Apple peut vous aider. http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html

Vous montre comment charger les images sans bloquer l'interface utilisateur.

+0

Avez-vous déjà entendu parler de quelqu'un utilisant le chargement paresseux pour ajouter des images qui sont stockées localement? – Jonah

+0

bien sûr! Si la liste est longue ou si les images sont volumineuses (par exemple, vous n'avez pas de vignettes séparées). Le but est le même: supprimer le chargement du thread d'interface utilisateur principal pour augmenter la réactivité. Généralement, vous utiliseriez une image d'espace réservé partagée unique que vous chargez une fois au début, donc il y a quelque chose qui se trouve là pendant le chargement de l'autre. – Dad

1

re votre: "Le problème que j'obtiens est que les images se chargent très lentement et lorsque je fais défiler la table, les images précédemment affichées s'affichent pendant quelques secondes jusqu'à ce que la nouvelle image soit chargée." Je parie que c'est parce que la cellule de l'image est réutilisée mais dans le cas où elle n'est pas nulle, vous ne définissez pas la propriété de l'image à zéro pour effacer l'ancienne. Juste une supposition puisque votre code est évidemment maintenant différent de ce qui est posté ci-dessus.

BTW - Je n'ai pas encore utilisé de blocs car ils nécessitent iOS 4 (à moins que vous n'utilisiez des compilateurs Apple, c'est-à-dire PLBlocks) et j'ai écrit des applications pour supporter 3.x. Juste au cas où vous construisiez seulement contre 4.x maintenant et pourriez ne pas réaliser que le code que vous écoutiez allait être un non-aller sur iOS 3.x (par exemple, iPad pour le moment). Il est clair que vous pouvez faire du code conditionnel en fonction de la version de l'os à l'exécution et ainsi de suite.

Questions connexes