iOS8 Beta 3 UITableViewCellSubviews бесконечный цикл
В iOS8 были введены ячейки табличного представления с автоматическим изменением размера (WWDC Session 226 Что нового в представлениях таблиц и коллекций). В моем проекте я пытаюсь реализовать старое фиксированное поведение высоты строк. Кроме того, самое важное для меня - это установить значение по умолчанию cell.contentView
рамка с полями слева и справа. Итак, я меняю cell.contentView.frame
собственность и сразу после этого -[cell setNeedsLayout]
метод вызывается, и это приводит к застреванию клетки в бесконечном layoutSubviews
петля.
Действия по воспроизведению:
Создайте новый проект с одним представлением и замените контроллер представления по умолчанию на контроллер представления таблицы
Отключить автоматическое вычисление высоты просмотра таблицы
-(void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 0;
self.tableView.rowHeight = 44;
}
3. Удалите пользовательскую ячейку в виде таблицы в раскадровке,
Добавьте любое подпредставление в пользовательскую ячейку:,
Подкласс ячейка и изменить
contentView.frame
вlayoutSubviews
,Сборка и запуск.
Результат: симулятор заканчивается черным экраном, застрявшим в бесконечном цикле макетов подпредставлений.
Ожидаемый результат: симулятор, отображающий табличное представление с ячейкой 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;
}