Reputation: 4209
I know the documented advice is to use UICollectionViewFlowLayout if you are doing anything "like a grid or a line-based breaking layout". However, I am not sure this is true for my case.
I want a grid but do not want a line-breaking layout. Items should be laid out infinitely both horizontally and vertically without ever stacking. Essentially, a giant chessboard that scrolls horizontally or vertically if content goes beyond the frame.
To subclass UICollectionViewFlowLayout I would have to:
prepareLayout
to stop the layout from wrapping items. This seems like a lot of work.collectionViewContentSize
.Apple says they have done "lots of hard work" in crafting UICollectionViewFlowLayout, so I should leverage it if I can. But if I have to override prepareLayout
to turn off line-breaking, I suspect that I am throwing away a large part of their work. Of their work that is left, I probably will not use most of it anyway (for example, minimumLineSpacingForSectionAtIndex
).
Because the layout I want is so simple, I suspect that I should subclass UICollectionViewLayout instead, because:
prepareLayout
in both cases, and I suspect that is where all the hard work will be.Is my conclusion correct?
Upvotes: 17
Views: 9714
Reputation: 5168
The layout you describe (items arranged in an indefinitely long horizontal line and sections arranged in an indefinitely long vertical line) resembles the "featured" section of the App Store :)
I have been meaning to use a similar concept in some of my apps too, and I think the trick here is that it's not handled by a single UICollectionView
. It appears that what you are looking for can be achieved by using a UITableView
as a base, and have each section of your content take up a single cell in the table. That is, each UITableViewCell
would contain a UICollectionView
with horizontal scrolling.
The key limitation of UICollectionView
that is sometimes not trivial to understand is that it is, after all, a single scrollView
. You can override some functionality to enable scrolling in both directions, but if you want some content to scroll one way, and some content to scroll another way, you would have to create nested scrollView
s.
Upvotes: 0
Reputation: 2340
UICollectionViewFlowLayout can't support two directions anyway, it scrolls along one axis only, either horizontally or vertically. So you have to subclass UICollectionViewLayout not UICollectionViewFlowLayout.
Then you have to override prepareForLayout, layoutsAttributesForElementsInRect methods as you said correctly..
Upvotes: 13