11

EDIT: I have create a very small app that represents perfectly the problem. https://drive.google.com/file/d/0B6sI4Feh1HJUb3pGa2pBUmY4QW8/view?usp=sharing

In the sample app, we just need to scroll down then press the button on the top bar to see the problem I am having


I am using https://github.com/jamztang/CSStickyHeaderFlowLayout to have sticky headers behaviors (like default UITableView) inside my collection view.

It works pretty well when scrolling through the collection view. I have a search bar outside the collectionview that allows users to filter the data with search text, everytime the user enters a letter, I'm refreshing the collectionview's data with the found data.

The problem is let's say there is currently 4 sections inside the collection view and that it is scrolled completely at the bottom. When I input a certian letter, it filters out everything but a single item (with a single header). The content size then changes for the collection view and displays the proper data, but then the header is too low (see screenshot).

I have investigated inside the flowlayout and inside the layoutAttributesForElementsInRect and I see it actually set the frame's origin Y to 0 (like it should be), but it seems the collectionview doesn't use this value and uses the previous one (which was when the collection view was scrolled down).

Any idea what could cause the UICollectionView to not use the desired frame inside layoutAttributesForElementsInRect ?

See wrong header

1 Answers1

0

I tried to fix this issue, but it looks like it's impossible till UICollectionViewLayout mechanism is black box for us. Custom layout correctly returns updated frame to layout engine on reloadData:

enter image description here

But hidden engine not even asking attributes if they are equal. In your case you can use simple workaround. Just update contentOffset after reload.:

[self.collectionView reloadData];
self.collectionView.contentOffset = CGPointZero;
Timur Bernikovich
  • 5,660
  • 4
  • 45
  • 58