UICollectionView с переменными размерами ячеек

Я немного борюсь с размером ячеек в UICollectionView. В андроиде можно легко "завернуть" размер ячейки. Как и в iOS, у вас есть вызов функции «GetCell», и вы решаете, насколько большим он будет.

Разница в iOS заключается в том, что в функции «getCell» (UICollectionViewController) кажется, что вы не можете выбрать размер ячейки (или содержимого). Если я изменю размер, он проигнорирует его и все равно будет использовать общий «ItemSize» CollectionView (который одинаков для всех ячеек).

Иногда это приводит к не очень красивым представлениям. Например, если у меня есть горизонтальный список с изображениями, я хочу, чтобы расстояние между изображениями было одинаковым, независимо от того, имеет ли одно изображение 200x200, а другое 400x200. Таким образом, размер ячейки также должен быть другим.

Для разных ячеек можно определить разный размер. Вы можете использовать делегата Collectionview и функцию GetSizeForItem (= sizeForItemAtIndexPath в ObjC). Проблема в том, что эта функция вызывается ДО фактической функции GetCell.

Итак, если у меня есть более сложная ячейка, например, с некоторыми метками. В моей функции "GetCell" я создаю эту ячейку, и в конце, возвращая ячейку, я знаю, какого размера она должна быть. Однако в функции GetSizeForItem эта информация еще недоступна, потому что ячейка по-прежнему «нулевая».

Единственный способ, которым я мог бы это сделать, - это создать UIView для ячейки (чтобы я мог запросить размер) в момент вызова GetSizeForItem. Но это не кажется хорошим дизайном, потому что я создаю UIView до «GetCell», где я создам его снова.

Есть ли что-то, что я упускаю из виду?

С уважением, Мэтт


person Matt    schedule 23.11.2012    source источник


Ответы (1)


Действительно, GetSizeForItem вызывается отдельно от GetCell. Это сделано таким образом, потому что создание UIViews — это задача, требующая много времени и памяти, и вашему приложению либо не хватит памяти, либо ему придется размещать другие представления, чтобы иметь возможность обрабатывать большие списки.

Прежде чем представление будет представлено, UICollectionView (и UITableView) запрашивает размеры и позиции всех (или большинства) элементов в списке, чтобы знать, где их рисовать. Однако многие из этих элементов не будут видны, поэтому collectionView не нужно их создавать. Вот почему GetSizeForItem вызывается заранее, а GetCell — только позже.

В вашем случае попробуйте отделить логику вычисления размера представления от самого представления. Сделайте это простой математической формулой, для которой не требуется представление, чтобы она была достаточно быстрой, чтобы ее можно было запустить заранее.

person Eduardo Scoz    schedule 25.11.2012