Я хочу, чтобы мой текст в моем UITableViewCell был немного справа. Другими словами, я хочу иметь x-смещение. Это даже возможно? Должен ли я создавать пользовательскую ячейку только из-за этого?
UITableViewCell textLabel offset
Ответ 1
Вы можете попробовать следующее:
[cell setIndentationLevel:SOME_NUMBER];
[cell setIndentationWidth:SOME_OTHER_NUMBER];
Ответ 2
Вы можете использовать cell.indentationLevel
и при необходимости cell.indentationWidth
вместо пользовательского UITableViewCell для этого.
Ответ 3
Простое решение - вы можете изменить кадр textLabel.
CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += xOffset;
textLabelFrame.size.width -= xOffset;
cell.textLabel.frame = textLabelFrame;
Я также сделал это, создав пользовательский UILabel, который поддерживает edgeInsets, похожие на UIButton. Это лучшее решение b/c, вы можете разметить ярлык для правильного размера, но выше будет работать, если у вас есть простые потребности.
[EDIT 1/2: исправлена опечатка w/CGRect]
[РЕДАКТИРОВАТЬ 3: исправлена установка типовой настройки измененного кадра]
[EDIT 4: нужен простой подкласс]
Mea culpa. Я был не прав, что вы можете сделать это в tableView:cellForRowAtIndexPath
. Макет UITableViewCell происходит после того, как делегат/источник данных tableView имеет возможность настроить ячейку. Я протестировал реализацию ниже, она работает.
Сделайте, как я сказал выше, но создайте (простой) подкласс UITableViewCell
, который добавляет xOffset
в layoutSubviews
. Если вы это сделаете, вы также можете добавить свойство xOffset
, которое вы можете установить в tableView:cellForRowAtIndexPath:
.
@implementation XOffsetCell
// assumes property xOffset is defined and synthesized
- (void) layoutSubviews
{
[super layoutSubviews];
CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += self.xOffset;
textLabelFrame.size.width -= self.xOffset;
cell.textLabel.frame = textLabelFrame;
}
@end
Решение, предлагающее добавить пользовательский UILabel
в cell.contentView
, также является хорошим решением. Я заметил ваше замечание о том, что он скрывает встроенный textLabel
, но весь смысл. Вы больше не будете использовать встроенную метку, вместо этого используйте пользовательскую метку.
Ответ 4
Я не троллируюсь за голоса, но хотел показать, как выглядит код, предоставленный @iPhone монстром. Его решение является допустимым вариантом. Если вы добавите ярлык в ячейку после if (cell == nil)
, как и он, вы будете постоянно добавлять метки к выделенным ячейкам.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(50.0f, 10.0f, 150.0f, 20.0f)];
lbl.tag = OffsetLabelTag; // define this as a constant
[cell.contentView addSubview:lbl];
[lbl release];
}
UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:OffsetLabelTag];
[lbl setText:@"test text"];
return cell;
}
Ответ 5
Вы можете сделать это с помощью Autolayouts:
UITableViewCell* cell = [UITableViewCell new];
cell.textLabel.translatesAutoresizingMaskIntoConstraints = NO;
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(indentation)-[textLabel]-(indentation)-|"
options:0
metrics:@{@"indentation": @35}
views:@{@"textLabel": cell.textLabel}]];
Или используя Parus lib:
[cell.contentView addConstraints:(PVVFL(@"H:|-(indentation)-[textLabel]-(indentation)-|")
.withViews(@{@"textLabel": textLabel})
.metrics(@{@"indentation": @35}).asArray)];
Ответ 6
Другой способ:
-(NSInteger)tableView:(UITableView *)tableView
indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
return intOffset; // but is like '\t', not points
}
Ответ 7
Существует еще один не очень красивый и умный способ:) Позиция метки в TableViewCell зависит от размера изображения, присвоенного свойству cell.imageView.image. Поэтому, если вы хотите, чтобы ваш текст двигался вправо, вы можете добавить несколько пиксельных столбцов в изображение в ячейке.
Ответ 8
Вам будет достаточно cell.textLabel.textAlignment = UITextAlignmentCenter;
для вас. Он мог бы выровнять текст в центре, создавая это пространство для вас.