Скажем, у вас есть UICollectionView с обычным пользовательским UICollectionViewLayout.
Так что это >>> NOT <<< макет потока - это обычный пользовательскийlayout. </p>
Пользовательские макеты тривиальны, при вызове prepare
вы просто переходите к данным и размечаете каждый прямоугольник. Допустим, это коллекция с вертикальной прокруткой ...
override func prepare() {
cache = []
var y: CGFloat = 0
let k = collectionView?.numberOfItems(inSection: 0) ?? 0
// or indeed, just get that direct from your data
for i in 0 ..< k {
// say you have three cell types ...
let h = ... depending on the cell type, say 100, 200 or 300
let f = CGRect(
origin: CGPoint(x: 0, y: y ),
size: CGSize(width: screen width, height: h)
)
y += thatHeight
y += your gap between cells
cache.append( .. that one)
}
}
В этом примере высота ячейки просто фиксирована для каждого, скажем, трех типов ячеек - все без проблем.
Обработка динамической ячейкивысоты если вы используете макет потока хорошо изучен и действительно относительно прост . ( Пример , также см. Много объяснений на www.)
Однако, что если вы хотите динамическую высоту ячейки с ( NON -потоком) совершенно обычным повседневным UICollectionViewLayout?
Где приблизительныйItemSize?
Насколько я могу судить, в UICollectionViewLayout нет НИКАКОГО оцененного понятияItemSize?
Так что, черт возьми, вы делаете?
Вы можете наивно просто - в приведенном выше коде - просто рассчитать конечные высоты каждой ячейки тем или иным способом (например, вычислить высоту любых текстовых блоков и т. Д.). Но это кажется совершенно неэффективным: ничто из общего представления не может быть нарисовано до тех пор, пока не будут рассчитаны целые сотни размеров ячеек. Вы бы вообще не использовали динамическую высоту iOS и ничто не было бы как раз вовремя.
Полагаю, вы могли бы запрограммировать всю систему "точно в срок" с нуля. (Итак, что-то вроде ... сделайте размер таблицы на самом деле только 1, вычислите вручную эту высоту, отправьте ее в представление коллекции, вычислите высоту элемента 2, отправьте ее вместе и т. Д.) Но это довольно неубедительно.
Есть ли какой-нибудь способ достичь динамической высоты ячеек с помощью пользовательского UICollectionViewLayout - НЕ макета потока?
(Опять же, конечно, очевидно, что вы можете просто сделать это вручную, поэтому в приведенном выше коде рассчитайте все сразувсе 1000 высот, и все готово, но это было бы довольно неубедительно.)
Как я уже говорил выше, первая загадка - где ад - это понятие "предполагаемого размера" в (нормальном, не-потоке)) UICollectionViewLayout?