Автоматическое изменение размера NSCollectionViewItem по размеру экрана

Я пытаюсь создать NSCollectionView, где его элементы адаптируются к доступному пространству, а не определяют фиксированный размер для элементов и соответствующим образом изменяют размер NSCollectionView.

Я не мог найти способ добиться этого с помощью NSCollectionViewFlowLayout, поскольку для его элементов требуется фиксированный размер. Я довольно близко подошел к желаемому результату с NSCollectionViewGridLayout. Однако мне нужно, чтобы CollectionViewItems сохраняли соотношение сторон (квадраты) при масштабировании окна, содержащего NSCollectionView, в то время как GridLayout масштабирует элементы в соответствии с их min и maxItemSize. В зависимости от размера окна и количества элементов в коллекции я получаю элементы, которые не совсем квадратные.

Пример снимка экрана: искаженные элементы NSCollectionViewItems

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


person rooney    schedule 14.02.2017    source источник


Ответы (1)


Вам необходимо реализовать следующий протокол в вашем контроллере:

NSCollectionViewDelegateFlowLayout

Он имеет множество методов, позволяющих точно настраивать элементы (размер/положение/поля). Не забудьте установить макет представления коллекции как «поток» (в IB).

Ищите реализацию следующих методов:

func collectionView(collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAtIndex section: Int) -> NSEdgeInsets {

   ...

}

func collectionView(collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize {

   ...
}

func collectionView(collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
    ...
}
person Eugene Mankovski    schedule 18.02.2017
comment
Это означало бы вычислять размер ячеек в зависимости от размера окна и количества элементов, верно? Для этого нет «автоматического макета»? - person rooney; 20.02.2017
comment
Правильный. Автоматической раскладки для таких деталей нет. Я бы хотел, чтобы они сделали его немного более похожим на CSS-flexbox. - person Eugene Mankovski; 20.02.2017