2014-04-24 4 views
0

J'ai une fonction de chat dans l'application que je fais. Chaque cellule a un UITextView et j'ai besoin de calculer le **height and width** de chaque cellule. Je fais cela et puis cache ces données. Utilisation de NSLog J'ai déterminé que les données sont correctement mises en cache et que la hauteur de chaque ligne n'est demandée qu'une seule fois.UITableView retardé lors du défilement pour le chat comme l'application

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Message *message = [feedItems objectAtIndex:indexPath.row]; 

    NSString *reuseIdentifier; 
    if (message.iSentThisMessage) { 
     reuseIdentifier = @"MeCell"; 
    } else { 
     reuseIdentifier = @"HostCell"; 
    } 

    ChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 
    cell.textView.text = message.content; 

    if (message.frame.size.height == 0 && message.frame.size.width == 0) { 
     CGRect rect = cell.textView.frame; 
     rect.origin.x = 5; 
     rect.origin.y = 3; 
     CGSize size = [self text:message.content 
        sizeWithFont:[UIFont systemFontOfSize:17.0] 
       constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)]; 
     rect.size.height = size.height 
          + cell.textView.textContainerInset.bottom 
          + cell.textView.textContainerInset.top; 
     rect.size.width = [cell.textView sizeThatFits:CGSizeMake(225.0, rect.size.height)].width 
          + cell.textView.textContainerInset.left 
          + cell.textView.textContainerInset.right; 

     if (message.iSentThisMessage) { 
      rect.origin.x = 320 - (rect.origin.y + rect.size.width); 
     } 

     cell.textView.frame = rect; 
     message.frame = rect; 
     NSLog(@"Not Cached :("); 
    } else { 
     cell.textView.frame = message.frame; 
     NSLog(@"Cached!"); 
    } 

    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Message *message = [feedItems objectAtIndex:indexPath.row]; 
    CGSize size = [self text:message.content 
       sizeWithFont:[UIFont systemFontOfSize:17.0] 
      constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)]; 

    if (indexPath.row + 1 == feedItems.count) 
     size.height += 4; 

    NSLog(@"Height asked for."); 
    return size.height + 12; 
} 

En outre, une autre possibilité peut-être que je suis Redéfinition de la méthode suivante dans ma classe personnalisée uitableviewcell parce que sinon il réorganise le contenu de ma cellule.

- (void) layoutSublayersOfLayer:(CALayer *)layer { 

} 

Je n'arrive pas à comprendre comment le faire ne pas lag !!

+0

Sortez la logique de dimensionnement de 'cellForRowAtIndexPath'. Vous ne devriez pas en avoir besoin ici. – CrimsonChris

Répondre

0

Vous ne savez pas exactement pourquoi vous utilisez une vue de texte, mais vous devriez opter pour une étiquette si vous le pouvez.

De même, ne mettez pas en cache la hauteur dans votre méthode de délégation de table, c'est un mauvais effet secondaire. Calculez la hauteur à l'avant, soit lorsque le message est chargé/reçu, ou sur un fil d'arrière-plan pour le chargement par lots.

La vue de texte/cadre d'étiquette doit également être relative à la cellule, soit par redimensionnement automatique/disposition. Donc, vous ne devriez jamais le définir explicitement.

En plus de cela - profil en utilisant des instruments. C'est la seule chose qui va vraiment vous dire ce qui ne va pas.

+0

Merci! Je n'avais pas de bonne raison d'utiliser un textview. – SamB

Questions connexes