Подтвердить что ты не робот

IPhone UITableViewCell: изменение позиции textLabel

Я новичок в разработке iPhone, и сейчас я работаю над простым приложением для чтения RSS. Проблема, которую я испытываю, заключается в том, что мне нужно переместить textLabel внутри UITableViewCells. Я пробовал setFrame или setCenter, но ничего не делает. Кто-нибудь знает, что мне нужно сделать внутри метода tableView:cellForRowAtIndexPath:, чтобы изменить положение textLabel в верхней части ячейки (x = 0, y = 0)?

Спасибо

PS: UITableViewCell ссылается на переменную с именем cell. Я пробовал [cell setFrame:CGRectMake(0, 0, 320, 20)] без успеха.

4b9b3361

Ответ 1

Вы можете создать подкласс для UITableViewCell и настроить фрейм textLabel. См. Этот ответ: Ярлыки выравниваются в UITableViewCell. Это отлично работает для меня.

Это мой подкласс

#import "UITableViewCellFixed.h"
@implementation UITableViewCellFixed
- (void) layoutSubviews {
     [super layoutSubviews];
     self.textLabel.frame = CGRectMake(0, 0, 320, 20);
}
@end

Это мой UITableViewControllerClass:

UITableViewCellFixed *cell = (UITableViewCellFixed *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCellFixed alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

Ответ 2

Вы можете попробовать indentationLevel, separatorInset и другие свойства отступов содержимого объекта UITableViewCell.

Ответ 3

Кажется, я решил свою собственную проблему. Вот какой код, если кто-то столкнется с одной и той же проблемой:

UILabel *ttitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)] autorelease];
ttitle.font = [UIFont boldSystemFontOfSize:13];
ttitle.textColor    = [UIColor blackColor];
ttitle.textAlignment = UITextAlignmentLeft;

[ttitle setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];

[cell.contentView addSubview:ttitle];

Идея заключается в создании собственного объекта метки, потому что textLabel автоматически позиционируется и не может перемещаться.

Приветствия.

Ответ 4

Причина, по которой исходный код плаката не работает, заключается в том, что он выглядит так, что кадр textLabel устанавливается после того, как UITableViewCell был возвращен из вашего метода делегата.

Я заметил, что могу успешно изменить многие свойства textLabel, такие как выравнивание текста, цвет, шрифт и т.д., но изменение кадра не влияет и когда я печатаю кадр в отладчике позже (например, при выборе), рамка не то, что я установил. Поэтому я пришел к выводу, что структура UIKit изменяет фрейм textLabel после его возврата из метода делегата. Без сомнения, это, вероятно, было сделано, потому что инженеры Apple хотели убедиться, что ваш текст был обращен к экрану, поэтому они измеряют его и изменяют рамку так, чтобы она соответствовала. Вероятно, они полагали, что люди, такие как мы, которые хотели изменить положение текста, могли бы сделать это путем подклассификации или просто добавив еще один UILabel (или что-то еще) в качестве подсмотра. Разработчику-новичку может быть очень сложно, если его или ее текст не отображается в ярлыке или был усечен, потому что они не отрегулировали рамку.

В моем случае я хотел, чтобы текст был горизонтально по центру, чтобы быть конкретным цветом/шрифтом/размером и быть чуть выше по вертикали в ячейке. Будучи слишком ленив, чтобы подклассировать это, я сначала попытался изменить рамку. Когда это не сработало, я попытался найти ответ (нашел этот пост).

Моим окончательным решением было установить для свойства numberOfLines значение 0 и добавить в мой текст возвращаемые возвраты каретки. Теперь это Лень.

Ответ 5

В Swift 3 это будет

override func layoutSubviews() {
    super.layoutSubviews()
    self.textLabel?.frame.origin.x = 50
}