iOS правильный способ вычисления высоты ForRowAtIndexPath - PullRequest
1 голос
/ 29 марта 2012

Я хочу изучить общий и правильный способ расчета высоты для пользовательских ячеек.
Мои ячейки загружены из пера, они имеют две многострочные метки UILabel один над другим.
На данный момент я создаю специальную ячейку конфигурации в viewDidLoad и использую ее в heightForRowAtIndexPath.

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    [self configureCell:self.configurationCell forIndexPath:indexPath];
    CGRect configFrame = self.configurationCell.frame;
    configFrame.size.width = self.view.frame.size.width;
    self.configurationCell.frame = configFrame;

    [self.configurationCell layoutSubviews];

    UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2];
    float height = label.frame.origin.y + label.frame.size.height + 10;

    return height;
}

Это работает, но, похоже, плохо. Я думаю, что высоты должны быть предварительно рассчитаны для каждого элемента и для каждой ориентации. Но я не могу найти способ сделать это красиво и просто.
Не могли бы вы помочь мне?
Стиль метки ячейки (например, шрифт и смещения от границ экрана) должен быть загружен из файла пера (ячейка находится внутри пера).

Добавлен метод layourSubviews ячейки:

-(void) layoutSubviews {

    [super layoutSubviews];

    [self.shortDescriptionLabel resize];

    CGRect longDescriptionFrame = self.longDescriptionLabel.frame;
    longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5;
    self.longDescriptionLabel.frame = longDescriptionFrame;

    [self.longDescriptionLabel resize];
}

метод изменения размера метки просто увеличивает ее высоту, чтобы вместить весь текст. Таким образом, высота ячейки вычисляется как longDescriptionLabel.bottom + 10. Простой код, но не очень красивый.

1 Ответ

1 голос
/ 29 марта 2012

Похоже, что вы пытаетесь создать подпредставления внутри heightForRowAtIndexPath.Предполагается, что создание представления должно быть выполнено в cellForRowAtIndexPath.

. В соответствии с вашей реализацией вы можете определить высоту ячейки только после того, как она была размещена.Это не очень хорошо, потому что UITableView вызывает heightForRowAtIndexPath для каждой ячейки, а не только для видимых при перезагрузке данных.В результате создаются подпредставления для всех ячеек, даже если они не обязаны быть видимыми.

Чтобы оптимизировать эту реализацию, вы должны разработать некую формулу, позволяющую определять высоту без разметки представлений.,Даже если ваш макет эластичен или имеет переменную высоту, учитывая текстовый прямоугольник, вы все равно можете определить его высоту.Используйте [NSString sizeWithFont:], чтобы определить отображаемый прямоугольник.Запишите эту информацию в свой делегат данных.Когда вызывается heightForRowAtIndexPath, верните его напрямую.

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