Получить tableView: heightForRowAtIndexPath: произойти после tableView: cellForRowAtIndexPath :? - PullRequest
14 голосов
/ 30 августа 2009

У меня есть несколько UITableViewCells, которые должны изменять свою высоту в зависимости от длины строк внутри. Я вычисляю необходимую высоту внутри tableView:cellForRowAtIndexPath:, а затем сохраняю ее в переменной (self.specialRowHeight). Тогда у меня есть:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == SPECIAL_SECTION) {
        return self.specialRowHeight;
    }
    else {
        return 44;
    }
}

За исключением того, что, кажется, вызывается до бита tableView:cellForRowAtIndexPath:, поэтому он всегда равен нулю.

Есть ли способ обойти это, или, возможно, другой способ сделать это?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 30 августа 2009

Собираюсь ответить на мой собственный вопрос здесь:

Изначально я был почти уверен, что расчеты высоты были привязаны к методу tableView:cellForRowAtIndexPath: и не могли быть перенесены в другое место. Тем не менее, с помощью реструктуризации, я смог вытащить все это оттуда и в tableView:heightForRowAtIndexPath:, который решает все.

Для тех, кто пытается заставить работать ячейки с автоматической регулировкой высоты, вот код, который может помочь:

// Inside tableView:cellForRowAtIndexPath:
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = self.numberOfTextRows;
// numberOfTextRows is an integer, declared in the class

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

    CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap];
    // This gets the size of the rectangle needed to draw a multi-line string
    self.numberOfTextRows = round(theSize.height / 18);
    // 18 is the size of the font used in the text label
    // This will give us the number of lines in the multi-line string

    if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) {
        return 44;
        // 44 is the default row height; use it for empty or one-line cells (or in other table sections)
    } else {
        return theSize.height + 16;
        // 16 seems to provide a decent space above/below; tweak to taste
    }
}

Если вы можете придумать более точный способ вычисления правильной высоты клетки, я весь в ушах. :)

0 голосов
/ 14 октября 2011

Моим решением было вызвать tableView:cellForRowAtIndexPath: внутри реализации tableView:heightForRowAtIndexPath: следующим образом

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

   [self tableView:aTableView cellForRowAtIndexPath:indexPath];
   return headerHeight;
}
0 голосов
/ 22 сентября 2009

Вы можете просто установить self.numberOfLines на 0 один раз, и это будет работать так же. (Если для numberOfLines установлено значение 0, то в метке используется столько строк, сколько необходимо.)

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