iOS8 Beta 3 UITableViewCellSubviews бесконечный цикл

В iOS8 были введены ячейки табличного представления с автоматическим изменением размера (WWDC Session 226 Что нового в представлениях таблиц и коллекций). В моем проекте я пытаюсь реализовать старое фиксированное поведение высоты строк. Кроме того, самое важное для меня - это установить значение по умолчанию cell.contentView рамка с полями слева и справа. Итак, я меняю cell.contentView.frame собственность и сразу после этого -[cell setNeedsLayout] метод вызывается, и это приводит к застреванию клетки в бесконечном layoutSubviews петля.

Действия по воспроизведению:

  1. Создайте новый проект с одним представлением и замените контроллер представления по умолчанию на контроллер представления таблицы

  2. Отключить автоматическое вычисление высоты просмотра таблицы

-(void)viewDidLoad { [super viewDidLoad]; self.tableView.estimatedRowHeight = 0; self.tableView.rowHeight = 44; } 3. Удалите пользовательскую ячейку в виде таблицы в раскадровке,

  1. Добавьте любое подпредставление в пользовательскую ячейку:,

  2. Подкласс ячейка и изменить contentView.frame в layoutSubviews,

  3. Сборка и запуск.

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

Ожидаемый результат: симулятор, отображающий табличное представление с ячейкой contentView имея пользовательский кадр.

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

  • self.tableView.estimatedRowHeight = 0; self.tableView.rowHeight = 44;
  • cell.contentView.frame = CGRectMake(...)
  • cell have custom subviews dropped on it in xib or storyboard

У Apple нет проблемы в списке "Известные проблемы" для iOS8, поэтому мне интересно, действительно ли это ошибка в iOS8 или кто-нибудь знает, как решить проблему?

2 ответа

Это не ошибка: setNeedsLayout будет вызываться каждый раз, когда вы меняете рамку представления.

Я думаю, что изменение cell.contentView.frame также меняется cell.bounds в iOS 8 срабатывает ретрансляция. Это поведение может отличаться в разных версиях iOS; в любом случае, это стандартные представления, поэтому мы не должны изменять их неподдерживаемыми способами.

Вместо того, чтобы работать на cell.contentViewкак насчет добавления пользовательского представления со вставками к нему? Или просто создать ограничение по высоте?

В ViewDidLoad, пожалуйста, используйте строку ниже, и нет необходимости указывать высоту строки

-(void)viewDidLoad {
        [super viewDidLoad];
        self.tableView.estimatedRowHeight = 44.0f;
        self.tableView.rowHeight = UITableViewAutomaticDimension;
}
Другие вопросы по тегам