UICollectionViewFlowLayout против подкласса UICollectionViewLayout

Я знаю, что документированный совет - использовать UICollectionViewFlowLayout, если вы что-то делаете "как сетка или макет разбивки на основе строк". Однако я не уверен, что это верно для моего случая.

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

В подкласс UICollectionViewFlowLayout мне нужно:

  • Переопределить prepareLayout, чтобы остановить компоновку от упаковки элементов. Это похоже на большую работу.
  • Переопределить collectionViewContentSize.

Apple говорит, что они сделали "много тяжелой работы" в создании UICollectionViewFlowLayout, поэтому я должен использовать ее, если смогу. Но если мне нужно переопределить prepareLayout, чтобы отключить разрыв строки, я подозреваю, что я отбрасываю большую часть своей работы. Из их оставшейся работы я, вероятно, не буду использовать большую часть ее (например, minimumLineSpacingForSectionAtIndex).

Поскольку макет, который я хочу, настолько прост, я подозреваю, что я должен подклассифицировать UICollectionViewLayout, потому что:

  • У меня будет более простая и чистая реализация со всеми в одном классе макета вместо распространения между подклассом и делегатом.
  • Я не думаю, что это будет намного сложнее, чем подклассификация UICollectionViewFlowLayout, потому что я должен переопределить prepareLayout в обоих случаях, и я подозреваю, что именно там будет тяжелая работа.
  • Я буду лучше настраивать другие UICollectionViewLayoutAttributes обычным образом, чем пытаться добавить еще один kludge поверх подкласса UICollectionViewFlowLayout.

Верно ли мое заключение?

Ответ 1

UICollectionViewFlowLayout не может поддерживать два направления в любом случае, он прокручивается вдоль одной оси только по горизонтали или по вертикали. Таким образом, вы должны подклассы UICollectionViewLayout не UICollectionViewFlowLayout.

Затем вам необходимо переопределить методы prepareForLayout, layoutsAttributesForElementsInRect, как вы сказали правильно.

Ответ 2

Макет, который вы описываете (элементы, расположенные в бесконечно длинной горизонтальной линии и секции, расположенные на бесконечно длинной вертикальной линии), напоминает "признанный" раздел магазина приложений:)

Я тоже хотел использовать аналогичную концепцию в некоторых своих приложениях, и я думаю, что здесь трюк заключается в том, что она не обрабатывается одним UICollectionView. Похоже, что то, что вы ищете, может быть достигнуто с помощью UITableView в качестве базы, и каждый раздел вашего контента занимает одну ячейку в таблице. То есть каждый UITableViewCell будет содержать UICollectionView с горизонтальной прокруткой.

Ключевое ограничение UICollectionView, которое иногда не является тривиальным для понимания, состоит в том, что это, в конце концов, один scrollView. Вы можете переопределить некоторые функции, чтобы включить прокрутку в обоих направлениях, но если вы хотите, чтобы какой-то контент прокручивался в одну сторону, а некоторый контент прокручивался другим способом, вам нужно было бы создать вложенный scrollView s.