Метка переменной длины, высота строк таблицы и автоматическая компоновка

Существует много хорошей информации о SO и в других местах о том, как вычислить необходимую высоту для строки UITableView в зависимости от размера subview. Типичный пример и тот, который я применяю здесь, – это ячейка, содержащая метку с текстом переменной длины.

введите описание изображения здесь

Обычным советом является использование sizeWithFont:constrainedToSize:lineBreakMode: в heightForRowAtIndexPath: Но большинство примеров, которые я видел, используют «магический» номер, основанный на известной ширине метки.

 CGSize constraint = CGSizeMake(224.0, MAXFLOAT); //224 is known to be the width available CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; 

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

 CGSize constraint = CGSizeMake(self.tableview.bounds.size.width - 20 - 10 - 36 - 20, MAXFLOAT); //each non-label width subtracted CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; 

Это общий подход, но, похоже, он отсутствует. Кто скажет, что ширина других подзонов ячеек и даже шрифт гарантированно не изменятся (или всегда будут усердно изменяться в обоих местах)?

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

 + (CGFloat)heightRequiredForText:(NSString *)text usingWidth:(CGFloat)width { //a class method that tells the caller how much height is needed for the provided text, based on the cell's size and font constants CGSize constraintSize = CGSizeMake(width - kMargin - kGap - kMargin - kCheckboxWidth, MAXFLOAT); CGRect bounds = [text boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.labelFont} context:nil]; return bounds.size.height; } 

Это позволяет UITableViewController просто предоставлять текст и ширину текущей границы (т. Е. Ширину таблицы). Шрифт и макет можно изменить в подклассе ячейки, и все продолжает «просто работать».

Вопрос 1

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

вопрос 2

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

введите описание изображения здесь

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

Где и как я могу это реализовать? Должен ли я делать что-то в setEditing ячейки 😕 Возможно, добавление другого ограничения для ограничения высоты и включения усечения, при обратном применении при редактировании == НЕТ? Как насчет шаблона «проведите удалять» – я не думаю, что это вызывает setEditing? Как насчет layoutSubview – мог ли я что-нибудь сделать?

One Solution collect form web for “Метка переменной длины, высота строк таблицы и автоматическая компоновка”

Я пробовал много вещей – ближе всего я получил переопределение layoutSubviews, тестирование, если пользователь переключился в режим редактирования, и если он сначала фиксирует внутреннюю высоту метки, а затем добавляет временное ограничение для ее принудительного применения (которое затем было удалено, когда выход из режима редактирования). Он работал хорошо, за исключением нескольких краевых случаев.

Но потом я снова начал думать о авто-макете. Что я пытался достичь? Я не хотел, чтобы ярлык становился выше, когда его ширина была уменьшена. Это довольно простое ограничение:

 [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.contentView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]]; 

Добавление этого дополнительного ограничения работает хорошо. Обратите внимание, что я также переключаю режим разрыва строки, чтобы обрезать при редактировании:

введите описание изображения здесь

  • Добавление новой строки в управляемый NSFetchedResultsController UITableView
  • Имитировать левое перетаскивание UITableViewCell
  • Как вставить / скрыть / показать строку в статическом UITableView?
  • Как найти indexPath для нажатой кнопки в tableView Использование Seque
  • Изменение размера UITableView для соответствия содержимому
  • фатальная ошибка: init (coder :) не была реализована ошибка, несмотря на то, что она реализована
  • Как я могу прокручивать ячейки UITableView?
  • Почему мой первый заголовок раздела в таблице не отображается?
  • Удаление строки таблицы с анимацией с использованием данных ядра
  • Можно ли добавить UIView (Admob) в uitableviewcontroller или в uicollectionviewcontroller
  • как добавить поисковую панель в uitableview?
  • Interesting Posts

    ZbarSDK: прекратить обработку без отключения камеры

    Как автоматически изменить размер mkmapview, чтобы заполнить весь экран при изменении ориентации?

    Как правильно позиционировать подкачку ячейки UITableView вправо?

    Продолжить процесс загрузки в фоновом режиме IOS

    XCode делает снимок моего приложения при отправке?

    Использование незаявленного типа «GMSPlacesClient»

    Сравнить случаи перечисления с параметрами

    Принесите приложение iOS для Foreground в WatchKit

    Как объявить рекурсивные перечисления с помощью Swift 2.0

    Словарь Swift с массивом как значение

    Твердое решение для гибкого изменения размера UIView на основе подзонов

    Является ли SHA-256 нечувствительным к регистру?

    iOS LayoutSubviews вызывается несколько раз, когда размер subview изменяется

    Как я могу отключить прокрутку, когда «касался» встроенного iframe?

    Перемещение MKOverlayPathView исчезает за черепицей

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.