IOS: hauteur dynamique avec une uitableviewcell personnalisée
Je suis nouveau au développement ios et c'est mon problème à ce jour. Je suis en mesure de calculer dynamiquement la hauteur d'une cellule personnalisé via le délégué "heightForRowAtIndexPath". Ainsi, sur la première charge, chaque chose est d'afficher parfaitement bien.
Mon problème est que dès que je commence à défiler, tout juste mess up. Je pense que pendant le défilement de la "heightForRowAtIndexPath" n'est plus appelé par cellule obtenir l'affichage à l'écran, de sorte que la nouvelle hauteur de la cellule ne peut pas être calculé.
Et donc je suis coincé ici pour un certain temps. Je me demandais si l'un de vous pourrait me prêter un coup de main. je vous remercie à l'avance.
Je vais poster le code pour les fichiers pertinents. Ces fichiers incluent les cellules personnalisées h et m de fichier. et les fonctions de la vue-contrôleur m de fichier.
//######################################################
//HelpTableViewCell.h
#import <UIKit/UIKit.h>
@interface HelpTableViewCell : UITableViewCell {
IBOutlet UILabel *labelName;
IBOutlet UILabel *labelDescription;
IBOutlet UIView *viewBackground;
}
@property (nonatomic, retain) UILabel *labelName;
@property (nonatomic, retain) UILabel *labelDescription;
@property (nonatomic, retain) UIView *viewBackground;
@end
//######################################################
//HelpTableViewCell.m
#import "HelpTableViewCell.h"
@implementation HelpTableViewCell
@synthesize labelName;
@synthesize labelDescription;
@synthesize viewBackground;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
self.labelName.lineBreakMode = UILineBreakModeWordWrap;
self.labelName.numberOfLines = 0;
self.labelName.font = [UIFont boldSystemFontOfSize:15];
[self.labelName sizeToFit];
self.labelDescription.lineBreakMode = UILineBreakModeWordWrap;
self.labelDescription.numberOfLines = 0;
self.labelDescription.font = [UIFont fontWithName:@"Arial" size:15];
[self.labelDescription sizeToFit];
[super setSelected:selected animated:animated];
}
- (void) dealloc {
[labelName release], labelName = nil;
[labelDescription release], labelDescription = nil;
[super dealloc];
}
@end
//######################################################
//in my view controller m file
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"HelpTableViewCell";
HelpTableViewCell *cell = (HelpTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HelpTableViewCell" owner:nil options:nil];
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (HelpTableViewCell *) currentObject;
break;
}
}
}
cell.labelName.text = [self.instructionName objectAtIndex:indexPath.row];
cell.labelDescription.text = [self.instructionDescription objectAtIndex:indexPath.row];
return cell;
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellText = [self.instructionDescription objectAtIndex:indexPath.row];
UIFont *cellFont = [UIFont fontWithName:@"Arial" size:15];
CGSize constraintSize = CGSizeMake(320.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height + 25;
}
source d'informationauteur Daniel Nguyen
Vous devez vous connecter pour publier un commentaire.
Si le texte contenu dans les cellules va changer, vous aurez besoin d'un appel reloadData sur votre tableView quand il le fait, sinon le tableView:heightForRowAtIndexPath: ne sera pas appelé.
La façon dont le tableView œuvres, c'est qu'il rassemble les hauteurs pour toutes les lignes à chaque recharge (et de le recharger les variantes). C'est de cette façon iOS connaît la hauteur de l'ensemble de la table. Il ne demande pas tableView:heightForRowAtIndexPath: encore une fois lors de la saisie des cellules individuelles. En général, les appels reloadData est assez rapide, et cette méthode, contrairement à ses variantes, ne cause pas de défilement.
Voir stackoverflow question et la réponse utiles en arrière-plan.
Des problèmes surviennent si vous avez à faire beaucoup de travail pour calculer les hauteurs et vous avez des centaines ou des milliers de lignes. Dans un cas d'utilisation que j'ai de ce genre, je cache la hauteur de ligne calculs pour obtenir des performances décentes. Mais si ce n'est pas votre cas, il suffit d'être un peu plus libérale avec reloadData.
Il y a un bon tutoriel qui vous guide à travers le processus de détermination de la hauteur qui est nécessaire pour s'adapter à votre texte et dimensionnement de la hauteur de la cellule de façon appropriée.
le tutoriel est disponible ici: http://www.raddonline.com/blogs/geek-journal/iphone-sdk-resizing-a-uitableviewcell-to-hold-variable-amounts-of-text/
Je n'ai pas tenté les méthodes dans le tutoriel moi-même, mais il a l'air d'être assez complet.
Espérons que cette aide!
Votre
tableView:heightForRowAtIndexPath:
semble correct, mais vous pourriez vouloir vérifier les points suivants sur le labelDescription étiquette de la cellule dans votre fichier XIB:tableView:heightForRowAtIndexPath:
méthode (dans votre cas, 320)tableView:heightForRowAtIndexPath:
méthode (dans votre cas "Arial" size 15)Si vous pensez que le
tableView:heightForRowAtIndexPath:
méthode n'est pas appelée après défilement, vous pouvez vérifier facilement que par l'ajout d'un temporaireNSLog
déclaration de la méthode. S'il n'est jamais appelé, vous pourriez avoir oublié de régler votre point de vue en tant que contrôleur de laUITableView
'sUITableViewDelegate
délégué.