Ошибка представления заголовка раздела в обычном uitableview

У меня есть табличное представление типа UITableView с двумя разделами и динамическим количеством строк. Также я возвращаю UIView для заголовка раздела.

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

Автомакет в представлении заголовка и суперпредставлении кажется не нарушающим. Я установил вид нижнего колонтитула таблицы либо nil, либо показываю анимацию разбиения на страницы. И представление таблицы находится в представлении прокрутки.

Любое предложение или решение, почему этот сбой возникает для заголовка раздела. И этот глюк происходит только в iOS 9


person Anand Prem    schedule 09.01.2016    source источник
comment
Сорри, на самом деле это около тысячи строк кода. Я уверен, что не изменяю вставку или смещение содержимого вручную. Но я сомневаюсь, что настройка представления нижнего колонтитула изменяет смещение или вставку содержимого. Перед перезагрузкой табличного представления заголовок раздела имеет значение 1300 (content offset.y), но после перезагрузки он получает около 3000 или что-то в этом роде. Просмотр иерархии обрезанных представлений показывает, что она находится где-то внизу.   -  person Anand Prem    schedule 09.01.2016
comment
Также, когда начали прокручивать представление таблицы, заголовок раздела остается в исходном положении.   -  person Anand Prem    schedule 09.01.2016
comment
=> Вы пытаетесь изменить стиль таблицы на «сгруппированный», чтобы раздел не перемещался. => см. сообщение ниже, это может вам помочь: - stackoverflow.com/questions/ 8306792/uitableview-reload-section   -  person Akash    schedule 09.01.2016
comment
Я использую обычный вид таблицы, потому что хочу, чтобы заголовок раздела был сверху.   -  person Anand Prem    schedule 09.01.2016
comment
И спасибо @Akash, эта тема кажется полезной, я попробую   -  person Anand Prem    schedule 09.01.2016
comment
@AnandPrem вы нашли решение этой проблемы? У нас похожий глюк. Любая помощь будет оценена, спасибо   -  person MDMonty    schedule 29.11.2016
comment
@MDMonty Первоначально я добавил контроллер обновления в качестве подвида моего табличного представления, позже я создал контроллер табличного представления и добавил табличное представление в качестве его подпредставления, а затем добавил свойство контроллера обновления табличного представления. Это исправляет мою проблему.   -  person Anand Prem    schedule 29.11.2016


Ответы (2)


Проблема для меня была независима от управления обновлением, хотя это часть моего контроллера представления. Это было связано с estimatedRowHeight и rowHeight.

Я нашел эмпирическое решение. Моя проблема возникла при переходе между контроллером представления и перезагрузкой таблицы.

Поскольку мои ячейки имеют переменную высоту, у меня было:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0f;

поэтому я могу иметь дело с автоматическим изменением размера ячейки. Видимо проблема была с estimatedRowHeight. Когда я изменил значение с максимальной высотой строки ячейки, глюк исчез. Секция стола больше не прыгала. Я использовал инспектор представлений, чтобы рассчитать высоту строки на основе моего наихудшего варианта использования.

Примечание №1

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

Заметка 2

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

person mulp    schedule 01.12.2016

Мои проблемы решаются следующим образом.

Первоначально я добавил контроллер обновления в качестве подвида табличного представления.

_chatListRefreshControl = [[UIRefreshControl alloc] init];
_chatListRefreshControl.transform = CGAffineTransformMakeScale(0.7, 0.7);
[_chatListRefreshControl addTarget:self
                            action:@selector(refreshChatListView:)
                  forControlEvents:UIControlEventValueChanged];
[self.myChatsTableView addSubview:_chatListRefreshControl];

Я изменил это следующим образом: индикатор обновления изменен с табличного представления на свойство контроллера табличного представления.

UITableViewController *chatTableViewcontroller = [[UITableViewController alloc] init];
    chatTableViewcontroller.tableView = self.myChatsTableView;
    _chatListRefreshControl = [[UIRefreshControl alloc] init];
    _chatListRefreshControl.transform = CGAffineTransformMakeScale(REFRESH_INDICATOR_SCALE_FACTOR, REFRESH_INDICATOR_SCALE_FACTOR);
    [_chatListRefreshControl addTarget:self action:@selector(refreshChatListView:) forControlEvents:UIControlEventValueChanged];
    chatTableViewcontroller.refreshControl = _chatListRefreshControl;
    [self addChildViewController:chatTableViewcontroller];
person Anand Prem    schedule 29.11.2016