Выравнивание нескольких строк UITableViewCell UILabel

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

Вот как это выглядит в раскадровке:

Снимок экрана из конструктора интерфейсов

«Заголовок» должен располагаться по центру по вертикали.


person graup    schedule 18.06.2012    source источник
comment
Я никогда не работал с раскадровками, не могли бы вы просто переделать прямоугольник основной метки, чтобы покрыть всю ячейку, чтобы она автоматически центрировалась по вертикали?   -  person DanZimm    schedule 18.06.2012


Ответы (2)


Вы можете использовать пользовательскую ячейку, в которой вы можете определить атрибуты пользовательских свойств. Размер текстовой метки не фиксирован. Я думаю, что это причина, почему выравнивание не работает.

person Siam    schedule 18.06.2012
comment
Это привело меня на правильный путь. Установка типа Custom делает свое дело. Мне все еще пришлось создать подкласс UITableViewCell для подключения меток к коду, но, вероятно, это невозможно. Спасибо! - person graup; 18.06.2012
comment
Если вы не хотите использовать пользовательский UITableViewCell, вы можете переписать метод -(void)layoutSubviews; для UITableViewCell по категориям. В этом методе вы можете установить все свойства подвидов, такие как textLabel, imageView и т. д. - person Siam; 19.06.2012

Вы можете создать подкласс UITableViewCell и выполнить макет в методе initWithStyle. Например:

Файл MyCustomCell.h:

@interface MyCustomCell : UITableViewCell
{
    UILabel *_label1;
    UILabel *_label2;
    UILabel *_titleLabel;
}

@property (nonatomic, strong) UILabel *label1;
@property (nonatomic, strong) UILabel *label2;
@property (nonatomic, strong) UILabel *titleLabel;
@end

Файл MyCustomCell.m:

#import "MyCustomCell.h"

@implementation MyCustomCell
@synthesize label1 = _label1;
@synthesize label2 = _label2;
@synthesize titleLabel = _titleLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        self.label1 = [[UILabel alloc]initWithFrame:CGRectMake(x, y, w, h)];  //x: x coordinate, y: y coordinate, w is width , h is height
        self.label2 = [[UILabel alloc]initWithFrame:CGRectMake(x, y, w, h)];
        self.titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(x, y, w, h)];
        self.titleLabel.font = [UIFont fontWithName:@"Times New Roman" size:30.0f]; //change font name and size per your needed.
        [self addSubview:self.label1];
        [self addSubview:self.label1];
        [self addSubview:self.titleLabel];
    }
    return self;
}

В файле класса, где у вас есть метод cellForRowAtIndexPath, обязательно включите #import "MyCustomCell.h" и используйте MyCustomCell вместо UITableViewCell для выделения ячейки. И присвоение данных меткам следующим образом:

cell.label1.text = xxxx;
cell.label2.text = xxxx;
cell.titleLabel.text = xxxx;
person user523234    schedule 18.06.2012
comment
Спасибо! Я знаю, что это возможно, но я хотел бы сохранить этот дополнительный класс. - person graup; 18.06.2012