2014-01-19 3 views
-3

Я уже много читал об этом, но похоже, что нет простого решения.Динамическая высота UITableViewCell

Я пытаюсь создать приложение, которое загружает NSArray из NSString комментариев для отображения в UITableView. Комментарии все различаются по размеру.

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

Я пытаюсь найти простое решение, не прибегая к использованию магических чисел CFloat.

Есть ли метод в API Apple, который позволяет рассчитать необходимую высоту cell.detailTextLabel с учетом комментария NSString и фиксированной ширины?

Я думаю, что если я могу вычислить эту высоту, все, что нужно, - установить высоту ячейки и высоту строки.

Не уверен, что делать, поскольку я прочитал ячейку еще не создан, когда вызывается heightForRow:AtIndexPath:.

+0

Возможный дубликат [iOS вычисляет высоту текста в ячейке tableView] (http://stackoverflow.com/questions/14841193/ios-calculate-text-height-in-tableview-cell) – dasblinkenlight

+0

Возможный дубликат [Динамическая высота UITableViewCell ] (http://stackoverflow.com/questions/10744277/dynamic-height-of-uitableviewcell?rq=1) – voromax

ответ

2

Вычислить высоту текста в tableView:heightForRowAtIndexPath:

Вы должны использовать boundingRectWithSize:options:context: на прошивке 7+ и sizeWithFont:forWidth:lineBreakMode: на IOS 6 и ниже. Дополнительную информацию см. В документации к яблоку.

UIFont *font = [UIFont oka_commentLabelFont]; 
NSString *text = [self commentForIndexPath:indexPath]; 
CGFloat cellWidth = 300.f; 

CGSize boundingSize = CGSizeMake(widthForCell, CGFLOAT_MAX); 
CGSize size; 

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { 
    size = [text boundingRectWithSize:boundingSize 
          options:NSStringDrawingUsesLineFragmentOrigin 
         attributes:@{ NSFontAttributeName : font } 
          context:nil].size; 
} else { 
    size = [text sizeWithFont:font 
      constrainedToSize:boundingSize 
       lineBreakMode:NSLineBreakModeWordWrap]; 
} 

return size.height; 

Необходимо установить шрифт того же шрифта, который вы хотите использовать в ячейке. Если вы поместите это в блок performUpdates на tableView, тогда вы получите красивую расширяющуюся анимацию.

+0

Кажется, что не работает. Мой текст по-прежнему заканчивается эллипсисом, но клетка теперь огромна. – user3142893

+2

Вы установили маску автомасштабирования на этикетке? убедитесь, что он имеет изменяемую высоту. Если вы используете IB легко, см. Изображение: http://www.techotopia.com/images/2/27/Iphone_view_autosize_height_width.jpg Вы захотите, чтобы все было проверено - так что его красный цвет. –

+0

Вы имеете в виду автомаркет 4 сторон ограничения на этикетке в раскадровке? Я пытался это сделать, но это не позволит мне. – user3142893

-1

Использование

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return [super tableView:tableView heightForRowAtIndexPath:indexPath]; 
} 
+0

Как это отличается от отказа в реализации 'tableView: heightForRowAtIndexPath:'? – dasblinkenlight

+0

Вы предлагаете использовать это, если я решаю подкласс UITableView или UITableViewCell? Потому что я пытаюсь найти простое решение, не прибегая к подклассу. Я не хочу делать много кодирования, чтобы узнать, что Apple имеет простой способ решить эту проблему. – user3142893

1

Не устанавливайте высоту ячейки, установить высоту строки и табличном сделает все остальное.

Чтобы вычислить высоту текста, запросите метку с кодом textRectForBounds:limitedToNumberOfLines: или попросите строку с помощью одного из многих методов, например sizeWithFont:constrainedToSize:lineBreakMode:.

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

+0

Итак, как только я установил свои комментарии NSString в 'cell.detailTextLabel', я использую' textRectForBounds: limitedToNumberOfLines: '? Но дело в том, что я не назначаю свои комментарии до cellForRowAtIndexPath, поэтому моя cell.detailTextLabel по-прежнему равна нулю, когда вызывается highForRowAtIndexPath. – user3142893

+0

Нет, у вас должен быть массив строк или что-то в этом роде. Используйте строку оттуда в 'tableView: heightForRowAtIndexPath:' – Wain

0

да, мы можем рассчитать высоту UILabel в зависимости от режима прерывания шрифта и линии.

UIFont * font = [UIFont systemFontOfSize:12.0]; 
CGSize newSize = [text sizeWithAttributes:@{NSFontAttributeName:font}];// You can add other attributes in dictionary to like line break mode. 

Здесь вы получили новый размер для текста, который будет находиться в UILabel, теперь в hegihtForCellAtIndexPath методе вы можете изменить размер UITableViewCell. newSize.height - высота, необходимая для label, теперь вы можете добавить к ней значение для смещений и вернуть ее.

+0

sizeWithFont не рекомендуется. Является ли максимум максимальным с ячейкой? Что делать, если я пытаюсь сделать свой код более удобным для настройки на ipad и другие устройства? Я не уверен, куда бы я ввел ваш код, heightForRowAtIndexPath? Люди продолжают говорить, что ячейка и ее текстовая метка все еще ноль, когда вызывается heightForRowAtIndexPath. – user3142893

+0

Я редактирую свой ответ. вы правы его лишенные ...? –

+0

В вашем новом коде, когда вы используете переменную maximumLabelSize? Вы просто бросаете его в словарь, который переходит к sizeWithAttribute? – user3142893

Смежные вопросы