CSStickyHeaderFlowLayout Header Frame

EDIT: Я создал очень маленькое приложение, которое прекрасно представляет проблему. https://drive.google.com/file/d/0B6sI4Feh1HJUb3pGa2pBUmY4QW8/view?usp=sharing

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


Я использую https://github.com/jamztang/CSStickyHeaderFlowLayout, чтобы в моем представлении коллекции были применены липкие заголовки (например, UITableView по умолчанию).

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

Проблема заключается в том, что в настоящее время в представлении коллекции есть 4 раздела и что она полностью прокручивается внизу. Когда я ввожу букву certian, она отфильтровывает все, кроме одного элемента (с одним заголовком). Затем размер содержимого изменяется для представления коллекции и отображает правильные данные, но заголовок слишком низкий (см. Снимок экрана).

Я исследовал внутри flowlayout и внутри layoutAttributesForElementsInRect, и я вижу, что он фактически устанавливает начало Y кадра в 0 (как и должно быть), но, похоже, коллекция не использует это значение и использует предыдущий (который был, когда просмотр коллекции был прокручен вниз).

Любая идея, что может заставить UICollectionView не использовать нужный кадр внутри layoutAttributesForElementsInRect?

См. неправильный заголовок

Ответ 1

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

enter image description here

Но скрытый движок даже не спрашивает атрибуты, равны ли они. В вашем случае вы можете использовать простой обходной путь. Просто обновите contentOffset после перезагрузки.

[self.collectionView reloadData];
self.collectionView.contentOffset = CGPointZero;