UILabel внутри пользовательского UITableViewCell не рисует в правильном размере - PullRequest
4 голосов
/ 06 октября 2009

У меня есть пользовательская ячейка таблицы, которая содержит несколько UILabels. Во время выполнения я корректирую высоту надписей, чтобы они соответствовали их содержимому, используя sizeWithFont:constrainedToSize:lineBreakMode: и меняю их положение соответствующим образом. Последняя метка в ячейке содержит большое количество текста, что приводит к ее переносу, и у меня возникла очень странная проблема. Хотя вызов sizeWithFont возвращает правильный размер, и я устанавливаю фрейм UILabel на эту высоту, он делает пару строк короткими. Этот скриншот иллюстрирует то, о чем я говорю:

Screenshot of UILabel problem

В этом примере высота полного блока текста должна быть 90 (как проверено в Интерфейсном Разработчике), и это то, что возвращается из sizeWithFont. Это также высота, на которую установлен фрейм UILabel, которую я проверил, войдя в систему, а также остановив выполнение и проверив значение. Однако, как вы можете видеть, он явно , а не рисует все 90 пикселей в высоту, хотя он правильно выделяет пространство для него (тонкая черная линия над «Отредактировано» - это граница ячейки таблицы). Я полностью сбит с толку. Если кто-нибудь может подсказать, почему он так себя ведет, я был бы очень признателен.

Ответы [ 3 ]

7 голосов
/ 14 октября 2009

Наконец-то решение!

Оказывается, что ячейка выполняет компоновку дважды - один раз во время heightForRowAtIndexPath, где я настраиваю все высоты подпредставлений и ячейки, а затем во время некоторой транзакции, которая не отслеживается, происходящей из __CFRunLoopDoObservers. Как я это проследил? Я добавил переопределение layoutSubviews в свой пользовательский класс ячеек табличного представления, чтобы можно было установить его точку останова.

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

1 голос
/ 12 сентября 2014

С iOS 8 это больше не работает. Реализация layoutSubviews сама по себе не помогает, потому что компоновка подпредставлений уже изменилась при вызове метода.

Я нашел 2 решения:

  1. добавление NSLayoutConstraint для программной компоновки подпредставлений
  2. реализует подвид layoutSubviews и меняет фрейм

Пример решения 2:

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGRect frame = self.frame;
    frame.size.height = 39.f;
    self.frame = frame;
}
0 голосов
/ 06 октября 2009

Я боролся с подобными проблемами. Это было связано с другими свойствами, установленными в предыдущих воплощениях клетки. Чтобы найти / доказать это, я изменил reuseidentifer для ошибочной ячейки, чтобы убедиться, что это уникальная ячейка.

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