I have a UICollectionView. It scrolls horizontally, has only a single row of items, and behaves like a paging UIScrollView. I’m making something along the lines of the Safari tab picker, so you can still see the edge of each item. I only have one section.
If I delete an item that is not the last item, everything works as expected and a new item slides in from the right.
If I delete the last item, then the collection view’s scroll position jumps to the N-1th item (doesn’t smoothly animate), and then I see the Nth item (the one I deleted) fade out.
This behaviour isn’t related to the custom layout I made, as it occurs even if I switch it to use a plain flow layout. I’m deleting the items using:
[self.tabCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
Has anyone else experienced this? Is it a bug in UICollectionView, and is there a workaround?
I managed to get my implementation working using the standard
UICollectionViewFlowLayout. I had to create the animations manually.First, I caused the deleted cell to fade out using a basic animation:
Next, I caused the collection view to scroll to the previous cell. Once I’ve scrolled to the desired cell, I remove the deleted cell.
The only part that is slightly questionable is the
dispatch_after(). Unfortunately,-scrollToItemAtIndexPath:atScrollPosition:animated:does not have a completion block, so I had to simulate it. To avoid timing problems, I disabled user interaction. This prevents the user from interacting with the collection view before the cell is removed.Another thing I had to watch for is I have to reset my cell’s alpha back to 1 due to cell reuse.
I hope this helps you with your Safari-style tab picker. I know your implementation is different from mine, and I hope that my solution works for you too.