66 votes

Problème d'alignement central du texte dans UITableViewCell

Je suis assez novice en Objective-C et en développement iPhone et j'ai rencontré un problème en essayant de centrer le texte dans une cellule de tableau. J'ai fait des recherches sur Google mais les solutions proposées concernent un ancien bug du SDK qui a été corrigé et elles ne fonctionnent pas pour moi.

Un certain 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 également 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 affichées :

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

Aucun de ces éléments n'a d'effet sur l'alignement du texte. Je suis à court d'idées, toute aide serait la bienvenue.

Merci d'avance.

11 votes

UITextAlignment est déprécié dans iOS 6.0, il s'agit désormais de NSTextAlignment.

0 votes

cell.textLabel?.textAlignment = .center

130voto

NesReqSej Points 2247

Je ne sais pas si cela peut vous aider à résoudre votre problème, mais UITextAlignmentCenter fonctionne si vous utilisez initWithStyle:UITableViewCellStyleDefault

4 votes

Cela m'a aidé car je n'utilisais pas le subtil pour les cellules que je voulais centrer. Merci. Je suppose que UITextAlignmentCenter ne fonctionne pas pour les cellules UITableViewCellStyleSubtitle.

2 votes

UITextAlignmentCenter est maintenant déprécié. Voir ce poste pour une bonne alternative.

2 votes

PARFAIT. Quelqu'un chez Apple devrait être licencié pour nous avoir fourni des messages d'erreur qui n'expliquent pas comment résoudre les problèmes. Si ce n'était pas stackoverflow et des gens comme vous, nous serions tous foutus.

16voto

voidStern Points 2582

Cela ne fonctionne pas parce que le textLabel est seulement aussi large qu'il doit l'être pour un texte donné. ( UITableViewCell déplace les étiquettes comme bon lui semble lorsqu'il est réglé sur la valeur UITableViewCellStyleSubtitle style)

Vous pouvez remplacer layoutSubviews pour vous assurer que les étiquettes occupent 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 à ce que la hauteur et la position y restent inchangées, car tant que l'option detailTextLabel Le texte de l'article est vide textLabel sera centré verticalement.

0 votes

Ces lignes combinées avec : self.detailTextLabel.textAlignment = UITextAlignmentRight; y self.textLabel.textAlignment = UITextAlignmentRight; Est-ce que exactement ce que je recherchais et m'a permis de continuer à utiliser l'UITableViewCellStyleSubtitle.

4voto

Jeff Points 875

Ce hack permettra de centrer le texte lors de l'utilisation de UITableViewCellStyleSubtitle. Chargez les deux étiquettes de texte avec vos chaînes de caractères, puis effectuez cette opération avant de renvoyer la cellule. Il serait peut-être plus simple d'ajouter 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;
    NSString *pad = [@"" stringByPaddingToLength:spaces_needed withString:@" " startingAtIndex:0];
    cell.textLabel.text = [pad stringByAppendingString: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;
    NSString *pad = [@"" stringByPaddingToLength:spaces_needed withString:@" " startingAtIndex:0];
    cell.detailTextLabel.text = [pad stringByAppendingString:cell.detailTextLabel.text]; // center the text
}

0voto

Alexander Points 921

Sur 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 le tableau des méthodes :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *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

0voto

wzbozon Points 2851

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

Fichier MCCenterTextCell.h :

#import <UIKit/UIKit.h>

@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:(NSString *)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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X