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

Существует много хорошей информации о 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]]; 

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

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

  • Значение в последней строке изменения uitableview
  • Могу ли я поместить заголовок таблицы UIPageControl внутри UITableViewController?
  • создать простой чат в ios
  • Получение UIImage из MKMapView
  • Высота UITableViewHeaderFooterView
  • как иметь двойную границу для ячейки
  • Установить изображение в качестве фона для TableView с раскадрой в iOS
  • Сделайте phonecall ios xamarin
  • iOS создает одну статическую ячейку в верхней части динамической таблицы
  • Почему верхние и нижние колонтитулы следуют за движением ряда при его удалении?
  • Не удается нажать красную кнопку «минус удалить» в UITableView
  • Interesting Posts

    Удаление в NSDocumentDirectory и UIScrollView

    Xcode 7.0 XCTest dyld: не удалось загрузить вставленную библиотеку IDEBundleInjection

    Хранение и отправка HTTP-файлов cookie, не работающих в приложении PhoneGap

    Серьезная ошибка для UICollectionViewFlowLayout: minimumInteritemSpacing и minimumLineSpacing в режиме горизонтальной прокрутки

    Основные данные – блокировка при удалении постоянного хранилища

    Как сопоставить XML textContent с RestKit?

    UIAutomation через командную строку на реальном устройстве

    iOS / Swift – Невозможно установить значение Enum для Init ()

    Установить изображение на другом представлении UIImageView

    В какой степени iOS Movie Player можно настроить и настроить?

    UITableViewAutomaticDimension не работает должным образом в iOS 9

    Как изменить высоту строки поиска? стриж

    предупреждение: «символы» устарели: используйте String или Substring напрямую

    Получить дубликаты в NSArray

    Проблема создания интерфейса в Xcode 8

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