2015-07-10 2 views
3

Я использую Autolayout для моего нового UITableViewCells в большом проекте.iOS динамическая высота UITableViewCell и heightForRowAtIndexPath

У меня есть один TableView, где высота каждой строки вычисляется автоматически, там я не использую функцию делегата heightForRowAtIndexPath.

Я объявил расчетную высоту строки:

tableView.estimatedRowHeight = 44.0 
tableView.rowHeight = UITableViewAutomaticDimension 

Мой вопрос: на другой TableViewController есть много UITableViewCells, где программно нужно объявить высоту ячейки в heightForRowAtIndexPath. Я знаю, что было бы лучше преобразовать все ячейки для использования уникального решения, но в этом проекте много разных ячеек, поэтому я хотел бы использовать обходной путь и комбинировать динамически вычисленную высоту с автозапуском и программно рассчитанной строкой высота.

Возможно ли это?

ответ

14

Если вы используете iOS 8 и выше, вам не нужно динамически вычислять высоту. Автомакет сделает все для вас. Но если вы используете ниже IOS 8, вам нужно рассчитать высоту ячейки.

для IOS 8:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

И добавить ниже код в контроллере:

tableView.estimatedRowHeight = 400.0 
tableView.rowHeight = UITableViewAutomaticDimension 

Где estimatedRowHeight должна быть максимальная высота, которая может быть для вашей клетки.

Thanks

+0

Awesome Thanks. –

1

Динамически расчитывать высоту контента, используя boundingRectWithSize. Если у вас есть UILabel, который является динамическим, вы можете использовать следующее:

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

    /* Check Content Size and Set Height */ 
    CGRect answerFrame = [YOUR_LABEL.text boundingRectWithSize:CGSizeMake(240.f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"" size:14.0f]} context:nil]; 

    CGSize requiredSize = answerFrame.size; 

    return requiredSize.height; 
} 
0

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    int topPadding = cell.yourLabel.frame.origin.x; 
    int bottomPadding = cell.frame.size.heigth-(topPadding+cell.yourLabel.frame.size.height); 
    NSString *text = [DescArr objectAtIndex:[indexPath row]]; 
    CGSize maximumSize = CGSizeMake(cell.yourLabel.frame.size.width, 9999); 
    CGSize expectedSize = [text sizeWithFont:yourCell.yourLabel.font constrainedToSize:maximumSize lineBreakMode:yourCell.yourLabel.lineBreakMode]; 

    return topPadding+expectedSize.height+bottomPadding; 
} 
+0

Проблема в том, что у меня нет только одного UILabel. Но, как я вижу, динамическая высота работает только для iOS8 и выше - поэтому, когда я хочу поддерживать iOS 8, я должен вычислить высоту программно, правильно? – brokedid

+0

@brokedid Да, вы всегда должны вычислять высоту программно – Developer

+0

привет. Если высота экрана составляет ~ 700, но высота, вычисленная из метки, равна 1000, так что моя метка может отображать весь текст, потому что высота возврата 1000 не работает – kemdo