UITableViewCell смещение textLabel - PullRequest
21 голосов
/ 14 апреля 2011

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

Ответы [ 8 ]

107 голосов
/ 26 июля 2012

Вы можете использовать для этого cell.indentationLevel и при необходимости cell.indentationWidth вместо пользовательского UITableViewCell.

31 голосов
/ 14 апреля 2011

Вы можете попробовать это:

[cell setIndentationLevel:SOME_NUMBER];
[cell setIndentationWidth:SOME_OTHER_NUMBER];
11 голосов
/ 14 апреля 2011

Простое решение - вы можете изменить фрейм textLabel.

CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += xOffset;
textLabelFrame.size.width -= xOffset;
cell.textLabel.frame = textLabelFrame;

Я также сделал это, создав пользовательский UILabel, который поддерживает edgeInsets, аналогично UIButton.Это лучшее решение, потому что вы можете расположить этикетку для правильного размера, но вышеописанное будет работать, если у вас есть простые потребности.

[РЕДАКТИРОВАТЬ 1/2: исправлена ​​опечатка с CGRect]

[РЕДАКТИРОВАТЬ 3: исправленный тип опечатки измененный кадр]

[РЕДАКТИРОВАТЬ 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, но в этом весь смысл.Вы больше не будете использовать встроенную метку, вместо нее используйте собственную метку.

5 голосов
/ 14 апреля 2011

Я не троллю за голоса, но хотел показать, как должен выглядеть код, предоставляемый @iPhone monster.Его решение является допустимым вариантом.Если вы добавите метку в ячейку после 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;
}
4 голосов
/ 09 июля 2013

Вы можете сделать это с 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}]];

Или используя Парус lib :

[cell.contentView addConstraints:(PVVFL(@"H:|-(indentation)-[textLabel]-(indentation)-|")
                                  .withViews(@{@"textLabel": textLabel})
                                  .metrics(@{@"indentation": @35}).asArray)];
3 голосов
/ 08 октября 2015

Другой способ:

<code>
    -(NSInteger)tableView:(UITableView *)tableView 
                indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return intOffset;  // but is like '\t', not points
    }
0 голосов
/ 14 апреля 2011

Существует еще один не очень красивый и умный способ:) Положение метки в TableViewCell зависит от размера изображения, назначенного свойству cell.imageView.image. Поэтому, если вы хотите, чтобы ваш текст двигался вправо, вы можете добавить несколько пустых столбцов пикселей к изображению в ячейке.

0 голосов
/ 14 апреля 2011

Вам будет достаточно cell.textLabel.textAlignment = UITextAlignmentCenter;.Это может выровнять текст по центру, создавая это пространство для вас

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