Выровнять текст по центру в проблеме UITableViewCell - PullRequest
63 голосов
/ 12 августа 2010

Я немного новичок в разработке Objective-C и iPhone, и я столкнулся с проблемой при попытке центрировать текст в ячейке таблицы. Я искал в Google, но решения для старой ошибки SDK, которая была исправлена, и они не работают для меня.

Код:

- (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;
}

Выше не центрировать текст.

Я также попробовал метод willDisplayCell:

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

и я попробовал некоторые из старых опубликованных решений:

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

Ни один из них не влияет на выравнивание текста. Я исчерпал идею, любая помощь будет наиболее ценной.

Приветствия заранее.

Ответы [ 9 ]

125 голосов
/ 24 августа 2010

Не знаю, поможет ли это вашей конкретной проблеме, однако UITextAlignmentCenter работает, если вы используете initWithStyle:UITableViewCellStyleDefault

15 голосов
/ 17 октября 2011

Это не работает, потому что textLabel настолько широк, насколько это необходимо для любого заданного текста.(UITableViewCell перемещает метки так, как считает нужным, если установлен стиль UITableViewCellStyleSubtitle)

Вы можете переопределить layoutSubviews, чтобы убедиться, что метки всегда заполняют всю ширину ячейки.

- (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);
}

Обязательно сохраняйте высоту / y-позицию одинаковыми, потому что, пока текст detailTextLabel пуст, textLabel будет центрироваться по вертикали.

5 голосов
/ 12 апреля 2015

Используйте этот код:

cell.textLabel.textAlignment = NSTextAlignmentCenter;

Над кодом будет работать.Не используйте UITextAlignmentCenter, он устарел.

4 голосов
/ 13 января 2011

Этот хак будет центрировать текст при использовании UITableViewCellStyleSubtitle. Загрузите обе текстовые метки со строками, а затем сделайте это, прежде чем возвращать ячейку. Возможно, было бы проще просто добавить свои собственные UILabels в каждую ячейку, но я решил найти другой способ ...

// 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
}
0 голосов
/ 11 мая 2019

Вот что у меня работает ...

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 голосов
/ 02 марта 2016

В случае, если кто-то хочет выровнять текст вправо, я успешно адаптировал решение, описанное здесь .

cell.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.textLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.detailTextLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
0 голосов
/ 04 января 2016

Вы можете использовать код для центрирования текста

cell.indentationLevel = 1;

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

0 голосов
/ 12 марта 2013

В той же ситуации я создал пользовательский UITableViewCell с пользовательской меткой:

Файл MCCenterTextCell.h:

#import <UIKit/UIKit.h>

@interface MCCenterTextCell : UITableViewCell

@property (nonatomic, strong) UILabel *mainLabel;

@end

Файл 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 голосов
/ 09 января 2013

В 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);

}

В таблице методов:

- (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;
}

При необходимости то же самое можно повторить для self.detailTextLabel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...