10.11 NSCollectionView - определение размера ячейки динамически
Примечания к выпуску AppKit для OS X v10.11 предполагает, что элементы представления коллекции могут быть изменены для каждого элемента:
Размер элемента может быть определен глобально для всех элементов CollectionView (путем установки свойства «itemSize» в NSCollectionViewFlowLayout) или может варьироваться от одного элемента к другому (путем реализации -collectionView: layout: sizeForItemAtIndexPath: в делегате вашего CollectionView).
В моем случае мой CollectionViewItem состоит из одной метки, которая содержит строку различной длины. Я использую NSCollectionView для отображения массива строк, так как NSStackViews не поддерживают привязки массива и не переходят на новые строки. Массив строк связан с содержимым NSCollectionView через контроллер массива.
Файл пера моего элемента настроен правильно, корневое представление и метка имеютСодержание обниматься а такжеСопротивление сжатию содержимого Приоритеты 1000, а края выровнены с помощью AutoLayout.
Теперь метод делегата NSCollectionViewLayout имеет следующую подпись:
func collectionView(collectionView: NSCollectionView,
layout collectionViewLayout: NSCollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize
Моя идея теперь состоит в том, чтобы захватить сам элемент, выполнить макет над ним, а затем вернуть новый размер элемента.
let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size
Проблема этого подхода в том, что itemAtIndexPath возвращает nil. Если я возвращаю размер по умолчанию в нулевом случае, этот размер по умолчанию используется для всех ячеек.
Как я могу установить NSCollectionView для соблюдения ограничений AutoLayout моего элемента и для каждой ячейки динамически использовать вычисленный размер?