Последняя строка ячейки таблицы обрезается при изменении размера с помощью NSString sizeWithFont: constrainedToSize: lineBreakMode: - PullRequest
1 голос
/ 18 августа 2011

При использовании следующего кода для изменения размера строки таблицы последняя строка текста всегда обрезается, независимо от количества строк.Но добавлен пробел, который выглядит как достаточно места для текста.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat restOfTheCellHeight = tableView.rowHeight - cell.detailTextLabel.frame.size.height;
    CGSize constrainedSize = CGSizeMake(cell.detailTextLabel.frame.size.width, CGFLOAT_MAX);
    CGSize textHeight = [cell.detailTextLabel.text sizeWithFont:cell.detailTextLabel.font constrainedToSize:constrainedSize lineBreakMode:cell.detailTextLabel.lineBreakMode];
    CGFloat newCellHeight = (textHeight.height + restOfTheCellHeight);
    if (tableView.rowHeight > newCellHeight) {
        newCellHeight = tableView.rowHeight;
    }
    return newCellHeight;
}

Вот код в cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCellTableRowTypeSingleLineValueSmallLabel *cell = (CustomCellTableRowTypeSingleLineValueSmallLabel *)[tableView dequeueReusableCellWithIdentifier:@"CellTypeMultiLineLabelInCellSmallCell"];

    if (cell == nil) {
        NSArray *xibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellTableRowTypeSingleLine" owner:nil options:nil];
        for(id currentObject in xibObjects) {
            if([currentObject isKindOfClass:[CustomCellTableRowTypeSingleLineValueSmallLabel class]]){
                cell = (CustomCellTableRowTypeSingleLineValueSmallLabel *)currentObject;
            }
        }
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }   

    cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.detailTextLabel.numberOfLines = 0;

    cell.detailTextLabel.text = self.attributeStringValue;
    cell.textLabel.text = self.rowLabel;

    return cell;
}

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 19 августа 2011

Вы правильно вычисляете высоту ячейки в своем методе heightForRowAtIndexPAth, но затем в своем методе cellForRowAtIndexPath вы фактически никогда не используете его для установки высоты вашей метки внутри него.

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

В cellForRowAtIndexPath вам необходимо установить высоту надписи, используя те же вычисления.

т.е.

 CGSize constrainedSize = CGSizeMake(cell.detailTextLabel.frame.size.width, CGFLOAT_MAX);
 CGRect cframe = cell.detailTextLabel.frame;
 cframe.size.height = constrainedSize.height;
 cell.detailTextLabel.frame = cframe;

Вам также может понадобиться установить рамку просмотра контента (не знаю, как она работает с нестандартной ячейкой).

Я также не уверен, что было бы неплохо вызывать cellForRowAtIndexPath из метода heightForRowAtIndexPath (вероятно, было бы лучше просто получить прямой доступ к текстовым данным, которые вы используете непосредственно для вычисления размера).

0 голосов
/ 19 августа 2011

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

0 голосов
/ 18 августа 2011

Вам нужно вызвать [cell.detailTextLabel sizeToFit], чтобы метка действительно изменила размер в cellForRowAtIndexPath. Он не изменится сам по себе только потому, что вы установили numberOfLines на 0. Смотрите на этот вопрос и читайте ответы на него для получения дополнительной информации.

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