Попытка рассчитать размер кадра UILabel на основе объема текста для подпредставления ячейки - PullRequest
1 голос
/ 01 сентября 2011

В приведенном ниже коде есть код, который определяет размер кадра UILabel, и я думаю, что он работает, однако, когда я помещаю его в свой rowAtIndexPath для UItable, я получаю сомнительные результаты.

Возможно, я не совсем понимаю, как или что делает reuseIdentifier, но я поместил код для вычисления кадра только тогда, когда ячейка равна нулю. Что происходит, так это то, что высоты рассчитываются только для первых трех ячеек, а затем повторяются в последовательности для остальных ячеек. Например, высота первой ячейки используется для высоты четвертой ячейки.

Может быть, кто-то может указать мне правильное направление относительно того, как я должен настроить свои расчеты.

Спасибо!

if(cell == nil){

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                reuseIdentifier:DisclosureButtonCellIdentifier] autorelease];

    //start adding custom subviews to the table cell


    //addSubview for Description
UILabel *descValue = [[UILabel alloc] init];
    NSString *descString = rowData.summary;
    CGSize maximumSize = CGSizeMake(185, 130);
    UIFont *descFont = [UIFont fontWithName:@"HelveticaNeue" size:12];
    CGSize descStringSize = [descString sizeWithFont:descFont 
                                   constrainedToSize:maximumSize 
                                       lineBreakMode:descValue.lineBreakMode];
    CGRect descFrame = CGRectMake(125, 60, 185, descStringSize.height);
    descValue.frame = descFrame;

    descValue.backgroundColor = [UIColor redColor];
    descValue.font = descFont;
    descValue.tag = kDescriptionValueTag;
    descValue.lineBreakMode = UILineBreakModeWordWrap;
    descValue.numberOfLines = 0;

    [cell.contentView addSubview:descValue];
    [descValue release];
}


UILabel *desc = (UILabel *)[cell.contentView viewWithTag:kDescriptionValueTag];
    desc.text = rowData.summary;

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

Используя NSString UIKit Additions, вы можете получить ширину строки, используя определенный шрифт:

[myString sizeWithFont:myFont];

В этом наборе дополнений есть несколько других функций, которые могут помочь выяснить, насколько большим будет фрагмент текста с различными вариантами макета для однострочного и многострочного текста и т. Д.

Цель reuseIdentifier - позволить вам повторно использовать ячейку - с определенными подпредставлениями в определенных местах - без необходимости тратить время выполнения устройства на выполнение всей этой компоновки. Определенно полезнее еще в iPhone 1 день, когда процессор был намного медленнее. Пока вы не ознакомитесь с reuseIdentifiers, я бы посоветовал вам просто создавать новую ячейку при каждом вызове этой функции.

Каждый раз, когда ОС вызывает ваш cellForRowAtIndexPath, вам необходимо правильно заполнять контент. Все, что необходимо изменить или изменить в зависимости от строки, должно быть установлено.

0 голосов
/ 01 сентября 2011

Вы не показывали весь свой код, но обычно для реализации tableView: cellForRowAtIndexPath: вы начинаете со следующего:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // get a cell from the queue of reusable cells, if any
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: DisclosureButtonCellIdentifier];

    if (cell == nil) {
        // No cell to reuse, need to create a new one
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                 reuseIdentifier:DisclosureButtonCellIdentifier] autorelease];  

        // add cell subviews here      
    }

    // fill in cell content and resize subviews here
    ...

    return cell;
}

Как только вы создали 3 (в вашем случае) ячейки, они повторно используются кактаблица прокручивается, поэтому вам не нужно создавать ячейки.Вызов dequeueReusableCellWithIdentifier вернет одну из ранее созданных ячеек, если она больше не использовалась (она прокручивалась сверху или снизу).

0 голосов
/ 01 сентября 2011

Честно говоря, я не пытался полностью понять ваш код. Это почти невозможно, особенно потому, что вы закрываете метод скобками, ничего не возвращая, но cellForRowAtIndexPath, на который, я полагаю, вы ссылаетесь, требует возврата объекта UITableViewCell.

По-видимому, мы смотрим только на некоторую часть кода.

Однако правильная компоновка ячейки не является полной задачей. Вам необходимо указать в таблице высоту каждой ячейки. Вы можете реализовать

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

для этой задачи. Этот метод хорош, если высота ячейки меняется. Если высота ячейки отличается от стандартной, но не отличается от ячейки к ячейке, тогда установки свойства rowHeight tableView будет достаточно.

Я думаю, что в вашем случае реализация метода heightForRowAtIndexPath обязательна.

Кстати, вы можете захотеть взглянуть на подклассы UITableCellView и реализовать метод layoutSubviews в своем подклассе.

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