2009-11-30 5 views
2

Je veux calculer le nombre de lignes lorsque nous donnons du texte dans UITableviewcell? J'ai inséré du texte via UITextview qui est dans UITableview cell.but je veux augmenter la hauteur de la cellule basée sur UItextview qui est dans UITableview cell.suppose si elle a 4 lignes, une hauteur ... sinon autre hauteur ... je veux aussi calculer combien de lignes sont dans UITextview ... et aussi définir la hauteur à l'exécution? des pls d'aide ..?calculer le nombre de lignes lorsque nous donnons du texte dans UITableviewcell?

Répondre

5

Pour calculer la taille approximative de votre UITextView en fonction d'une chaîne, essayez la méthode - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode de NSString.

Par exemple:

NSString *myText = @"Lorem ipsum dolor sit amet, consectetur adipisicing..."; 

CGSize newSize = [myText sizeWithFont:[textView font] 
        constrainedToSize:CGSizeMake([textView frame].size.width, MAXFLOAT) 
         lineBreakMode:UILineBreakModeWordWrap]; 

CGFloat newTextViewHeight = newSize.height; 
CGFloat newTableViewCellHeight = newTextViewHeight + 42; 

... où textView fait référence à votre UITextView. (J'ai également supposé que le mode de saut de ligne de votre UITextView est UILineBreakModeWordWrap, sinon assurez-vous de changer le code approprié.)

2

Vous pouvez calculer la taille ajustée d'un UILabel basé sur le contenu NSString en utilisant la catégorie UIKitAdditions sur NSString. Ces méthodes comprennent ...

-sizeWithFont: 
-sizeWithFont:constrainedToSize: 
-sizeWithFont:constrainedToSize:lineBreakMode: 
-sizeWithFont:forWidth:lineBreakMode: 
-sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Dans mes implémentations de ce modèle, j'utilise généralement le troisième, -sizeWithFont:constrainedToSize:lineBreakMode:.

Les implémentations les plus efficaces de UITableViewCells à hauteur variable ne calculent la taille qu'une seule fois par chaîne affichée. Ceci est généralement une opération coûteuse et vous ne voulez certainement pas que des opérations coûteuses soient effectuées fréquemment pendant le défilement - votre FPS défilant passera à travers le plancher. Cela signifie mettre en cache la hauteur calculée quelque part, et pour moi c'est quelque part l'objet modèle associé à la ligne spécifique.

Personnellement, je crée une sous-classe personnalisée de UITableViewCell chaque fois que j'implémente une cellule de table à hauteur variable. Je crée ensuite une méthode de classe qui effectue simplement l'opération sizeWithFont:constrainedToSize:lineBreakMode: étant donné un objet modèle qui contiendra la chaîne affichée en tant que paramètre. Le contrôleur vue de table mise en œuvre de tableView:heightForRowAtIndexPath: de puis ressemble à ceci:

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { 
    CGFloat height; 
    DataObject *rowData = [self.dataArray objectAtIndex:indexPath.row]; 

    if (rowData.cachedHeight) { 
    height = [rowData.cachedHeight doubleValue]; 
    } else { 
    height = [CustomTableViewCell heightForRowWithString:rowData.contentStr]; 
    rowData.cachedHeight = [NSNumber numberWithDouble:height]; 
    } 

    return height; 
} 

N.B. Vous pouvez/devriez probablement utiliser un UILabel, plutôt qu'un UITextView, puisque vous n'avez pas besoin du comportement de défilement de UITextView.

Questions connexes