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.
Je ne sais pas si cela résout votre problème spécifique, cependant UITextAlignmentCenter
fonctionne si vous utilisez initWithStyle:UITableViewCellStyleDefault
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.
Utilisez ce code:
cell.textLabel.textAlignment = NSTextAlignmentCenter;
Le code ci-dessus fonctionnera . N'utilisez pas UITextAlignmentCenter, il est obsolète.
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
}
Vous pouvez utiliser du code pour centrer le texte
cell.indentationLevel = 1;
cell.indentationWidth = [Ecran principal UIScreen] .bounds.size.width/2-10;
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
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
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];
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);