Centrer le texte dans le problème UITableViewCell

Je suis un peu nouveau dans le développement d’Objective-C et de l’iPhone et j’ai rencontré un problème en essayant de centrer le texte dans une cellule de tableau. J’ai cherché sur google, mais les solutions concernent un ancien bug du SDK qui a été corrigé et qui ne fonctionne pas pour moi.

Un code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text = @"Please center me"; cell.textLabel.textAlignment = UITextAlignmentCenter; return cell; } 

Ce qui précède ne centre pas le texte.

J’ai aussi essayé la méthode willDisplayCell:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.textLabel.textAlignment = UITextAlignmentCenter; } 

et j’ai essayé certaines des anciennes solutions postées:

 UILabel* label = [[[cell contentView] subviews] objectAtIndex:0]; label.textAlignment = UITextAlignmentCenter; return cell; 

Aucun de ceux-ci n’a d’effet sur l’alignement du texte. Je suis à court d’idées, aucune aide ne serait plus appréciée.

A bientôt.

Je ne sais pas si cela aide votre problème spécifique, cependant UITextAlignmentCenter fonctionne si vous utilisez initWithStyle:UITableViewCellStyleDefault

Cela ne fonctionne pas car le textLabel est aussi large que nécessaire pour un texte donné. ( UITableViewCell déplace les étiquettes comme il l’entend lorsqu’il est défini sur le style UITableViewCellStyleSubtitle )

Vous pouvez substituer layoutSubviews pour vous assurer que les étiquettes remplissent toujours toute la largeur de la cellule.

 - (void) layoutSubviews { [super layoutSubviews]; self.textLabel.frame = CGRectMake(0, self.textLabel.frame.origin.y, self.frame.size.width, self.textLabel.frame.size.height); self.detailTextLabel.frame = CGRectMake(0, self.detailTextLabel.frame.origin.y, self.frame.size.width, self.detailTextLabel.frame.size.height); } 

Veillez à conserver la même hauteur / position y car, tant que le texte textLabel est vide, textLabel sera centré verticalement.

Ce hack va centrer le texte lors de l’utilisation de UITableViewCellStyleSubtitle. Chargez les deux étiquettes de texte avec vos chaînes, puis faites-le avant de renvoyer la cellule. Il serait peut-être plus simple d’append simplement vos propres UILabels à chaque cellule, mais j’étais déterminé à trouver un autre moyen …

 // UITableViewCellStyleSubtitle measured font sizes: 18 bold, 14 normal UIFont *font = [UIFont boldSystemFontOfSize:18]; // measured after the cell is rendered CGSize size = [cell.textLabel.text sizeWithFont:font]; CGSize spaceSize = [@" " sizeWithFont:font]; float excess_width = ( cell.frame.size.width - 16 ) - size.width; if ( cell.textLabel.text && spaceSize.width > 0 && excess_width > 0 ) { // sanity int spaces_needed = (excess_width/2.0)/spaceSize.width; NSSsortingng *pad = [@"" ssortingngByPaddingToLength:spaces_needed withSsortingng:@" " startingAtIndex:0]; cell.textLabel.text = [pad ssortingngByAppendingSsortingng:cell.textLabel.text]; // center the text } font = [UIFont systemFontOfSize:14]; // detail, measured size = [cell.detailTextLabel.text sizeWithFont:font]; spaceSize = [@" " sizeWithFont:font]; excess_width = ( cell.frame.size.width - 16 ) - size.width; if ( cell.detailTextLabel.text && spaceSize.width > 0 && excess_width > 0 ) { // sanity int spaces_needed = (excess_width/2.0)/spaceSize.width; NSSsortingng *pad = [@"" ssortingngByPaddingToLength:spaces_needed withSsortingng:@" " startingAtIndex:0]; cell.detailTextLabel.text = [pad ssortingngByAppendingSsortingng:cell.detailTextLabel.text]; // center the text } 

Utilisez ce code:

 cell.textLabel.textAlignment = NSTextAlignmentCenter; 

Le code ci-dessus fonctionnera. Ne pas utiliser UITextAlignmentCenter, il est obsolète.

Dans CustomTableViewCell.m :

 - (void)layoutSubviews { [super layoutSubviews]; self.textLabel.frame = CGRectMake(0, self.textLabel.frame.origin.y, self.contentView.frame.size.width, self.textLabel.frame.size.height); } 

Dans la table de méthodes:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSSsortingng *CellIdentifier = @"Cell"; CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text = @"Title"; cell.textLabel.textAlignment = UITextAlignmentCenter; return cell; } 

Si nécessaire, la même chose peut être répétée pour self.detailTextLabel

Dans la même situation, j’ai créé UITableViewCell personnalisé avec une étiquette personnalisée:

Fichier MCCenterTextCell.h:

 #import  @interface MCCenterTextCell : UITableViewCell @property (nonatomic, strong) UILabel *mainLabel; @end 

Fichier MCCenterTextCell.m:

  #import "MCCenterTextCell.h" @interface MCCenterTextCell() @end @implementation MCCenterTextCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSSsortingng *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.accessoryType = UITableViewCellAccessoryNone; self.selectionStyle = UITableViewCellSelectionStyleGray; _mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 320, 30)]; _mainLabel.font = BOLD_FONT(13); _mainLabel.textAlignment = NSTextAlignmentCenter; [self.contentView addSubview:_mainLabel]; } return self; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end 

Vous pouvez utiliser le code pour centrer le texte

cell.indentationLevel = 1;

cell.indentationWidth = [UIScreen mainScreen] .bounds.size.width / 2-10;

Si l’on souhaite aligner le texte à droite, j’ai réussi à adapter la solution décrite ici .

 cell.transform = CGAffineTransformMakeScale(-1.0, 1.0); cell.textLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0); cell.detailTextLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);