Динамический размер многострочного UILabel и сопровождающая ячейка просмотра таблицы программно

Я борюсь с тем, как динамически изменить размер uilabel внутри uitableviewcell, а также отрегулировать высоту ячейки таблицы в зависимости от текста, который я поместил в метку. Я хочу, чтобы строка целиком отображалась в ячейке таблицы, всегда с одинаковым размером шрифта для всех ячеек. Это кажется довольно стандартным, но я замечаю много дискуссий / дебатов / недовольства по поводу переполнения стека. Я начал с этих сообщений:

Изменение размера пользовательской ячейки с использованием UILabel на основе текста содержимого из файла JSON (ответ @Seya) boundingRectWithSize для NSAttributedString, возвращающего неправильный размер (ответ @JOM)

Функции, которые я пытаюсь использовать, являются копиями того, что сделал Сейя, почти без изменений. Тем не менее, я вижу, что хотя функция печатает разные высоты для разных ячеек, все, что я вижу, это 1 строка текста на ярлык, хотя они должны показывать много строк. Кроме того, странно, что текст из одной ячейки, кажется, отображается поверх другой ячейки - не уверен, связано ли это.

Мои 2 вопроса: (1) Почему я вижу только первую строку текста? (2) Почему UILabel/ ячейка не изменяет размеры в зависимости от высоты, которую я вижу напечатанной в журнале (или они изменяют размеры, но маскируются проблемой № 1)?

Вот три функции, которые я использую (они вместе с XIB - может ли XIB быть проблемой?):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
JudgeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
    if(!cell)
    {
        [tableView registerNib:[UINib nibWithNibName:@"JudgeCell" bundle:nil] forCellReuseIdentifier:@"JudgeCell"];
        cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
    }

    cell.username.text = self.object.answerUser[indexPath.row];
    cell.answer.text = self.object.answerArray[indexPath.row];

    NSString *text = cell.answer.text;
    CGSize constraint = CGSizeMake(50, 20000.0f);
    CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];

    cell.username.frame = CGRectMake(10, 10, 50, size.height); //MAX(size.height, 14.0f));

    return cell;

}

-(CGSize)frameForText:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size  {

    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;

    NSDictionary * attributes = @{NSFontAttributeName:font,
                                  NSParagraphStyleAttributeName:paragraphStyle
                                  };


    CGRect textRect = [text boundingRectWithSize:size
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:attributes
                                         context:nil];

    NSLog(@"size is %f ", textRect.size.height);
    return textRect.size;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    NSString *text = self.object.answerArray[indexPath.row];
    CGSize constraint = CGSizeMake(50, 20000.0f);
    CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];
    CGFloat height = size.height; //MAX(size.height, 14.0f);
    NSLog(@"size is %f AT INDEX %d", height, indexPath.row);
    return height + 20;
}

Спасибо за любой совет!

1 ответ

В конце концов я удалил свой связанный с ним файл пера, и каким-то образом это, похоже, помогло с кодом из этого урока (что похоже на то, что я уже опубликовал выше):

http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/

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

Другие вопросы по тегам