web-dev-qa-db-fra.com

Centrer le texte dans le problème UITableViewCell

Je suis un peu nouveau dans le développement Objective-C et iPhone et j'ai rencontré un problème en essayant de centrer le texte dans une cellule de tableau. J'ai effectué une recherche sur Google mais les solutions concernent un ancien bogue 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é quelques unes 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ée, toute aide serait très appréciée.

Bravo d'avance.

62
Magpie

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

124
Philip Jespersen

Cela ne fonctionne pas, car textLabel est aussi large que nécessaire pour un texte donné. (UITableViewCell déplace les étiquettes comme bon lui semble lorsque défini sur le style UITableViewCellStyleSubtitle)

Vous pouvez remplacer 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);
}

Assurez-vous de garder la même hauteur/position y, car tant que le texte de detailTextLabel sera vide, textLabel sera centré verticalement.

15
voidStern

Utilisez ce code:

cell.textLabel.textAlignment = NSTextAlignmentCenter;

Le code ci-dessus fonctionnera . N'utilisez pas UITextAlignmentCenter, il est obsolète.  

4
Tejinder

Ce hack va centrer le texte lorsque vous utilisez UITableViewCellStyleSubtitle . Chargez les deux étiquettes de texte avec vos chaînes, puis faites ceci avant de renvoyer la cellule. Il serait peut-être plus simple d'ajouter vos propres étiquettes UIL à 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
}
4
Jeff

Vous pouvez utiliser du code pour centrer le texte

cell.indentationLevel = 1;

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

0
dip

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

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
0
wzbozon

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 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

0
Alexander

Voici ce qui fonctionne pour moi ...

NSString *text = @"some text";
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:SOME_UIFONT}];

[cell setIndentationLevel:1];
[cell setIndentationWidth:(tableView.frame.size.width - size.width)/2.0f];

cell.textLabel.font = SOME_UIFONT;
[cell.textLabel setText:text];
0
declan

Si vous souhaitez 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);
0
Tal Aloni