0

У меня есть пользовательская ячейка с меткой в ​​ней. Я хочу сделать ярлык sizeToFit в cellForRow... и передать высоту меток переменной с именем labelHeight. Затем в heightForRow... я хочу вернуть labelHeight.Установите float в cellForRow .. и верните его в heightForRow

Проблема заключается в том, что она возвращает высоту 0. Вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [customCell.label sizeToFit]; 
    self.labelHeight = customCell.label.frame.size.height; 
    ... 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    return self.labelHeight; 
} 
+1

Это никогда не сработает. 'heightForRowAtIndexPath:' будет вызываться для многих строк задолго до того, как 'cellForRowAtIndexPath' когда-либо вызывается. – rmaddy

+0

Итак, что я могу сделать, чтобы исправить это? –

+1

Вы должны определить высоту в 'heightForRowAtIndexPath', не создавая сначала ячейку для строки. – rmaddy

ответ

0

Я не думаю, что это очень хорошее решение для этого, как heightForRowAtIndexPath вызывается перед cellForRowAtIndexPath.

Вы могли:

  • Вычислить высоту ячейки на heightForRowAtIndexPath путем вычисления размера, что объем текста с конкретным шрифтом (стиль и размер) будет принимать:

    CGSize size = [string sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];  
    CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height)); 
    

или вы можете имитировать весь вид, чтобы иметь более точную (но будет относительно дорого вычислить) или

  • Обновить TableView после того как вы рассчитали высоту ячейки на cellForRowAtIndexPath
+0

Я могу сделать первое решение, но единственная проблема в том, что его пользовательская ячейка, и я не знаю, как получить доступ к свойствам ячеек от 'heightForRow' –

+0

, добавлено больше объяснений о том, как вычислить размер строки в ячейке. –

+0

Я сделал 'nsLog'' adjustHeigh', и он продолжал зацикливать определенное число. Затем я вернул 'adjustHeight', и выбранная ячейка и все ячейки под ней были удалены. –

0

Если вы нуждаясь вычислить heightForRowAtIndexPath самый простой (хотя он чувствует себя неэффективный способ), чтобы позвонить cellForRowAtIndexPath из с heightForRow ... потом получить перезагрузку вызова в таблице, которая снова вызовет cellForRow ... Это кажется довольно грязным из-за двойного создания ячейки, и если вы можете упростить факторинг расчета высоты в известных константах динамическими, это может быть более эффективным но больше кода. например.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath(NSIndexPath *)indexPath{ 
    NSString *string = self.objects[indexPath.row]; 
    NSDictionary *textAttributes = nil; //attributes here 

    return self.someButton.frame.size.height + 
     self.someSwitch.frame.size.height + 
     [string boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX) 
         options:NSStringDrawingUsesLineFragmentOrigin 
        attributes:textAttributes 
         context:nil].size.height; 
} 

Лучшее решение, если вы в состоянии поддерживать IOS 8+ и используют autolayout, чтобы установить -estimatedRowHeight свойство на Tableview, отличное от нуля значение, то UILayoutConstraints на ячейке будет иметь возможность рассчитать это для тебя. Это новое очень приятное дополнение к tableViews в iOS8 и было описано в одном из видео WWDC. Но он не работает без автозапуска на ячейках.