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

UITableViewCell textLabel offset

Я хочу, чтобы мой текст в моем UITableViewCell был немного справа. Другими словами, я хочу иметь x-смещение. Это даже возможно? Должен ли я создавать пользовательскую ячейку только из-за этого?

4b9b3361

Ответ 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; для вас. Он мог бы выровнять текст в центре, создавая это пространство для вас.