macos cocoa autolayout nscollectionview nscollectionviewitem

macos - 10.11 NSCollectionView: determinación dinámica del tamaño de la celda



cocoa autolayout (0)

Las Notas de la versión de AppKit para OS X v10.11 sugieren que los elementos de la vista de colección pueden redimensionarse por elemento:

El tamaño del ítem puede determinarse globalmente para todos los ítems de CollectionView (estableciendo la propiedad "itemSize" de NSCollectionViewFlowLayout), o puede variar de un ítem a otro (implementando -collectionView: layout: sizeForItemAtIndexPath: en el delegado de CollectionView).

En mi caso, mi CollectionViewItem consiste en una sola etiqueta que contiene una cadena de longitud variable. Estoy usando NSCollectionView para mostrar una matriz de cadenas, ya que NSStackViews no admite enlaces de matriz y no fluye a nuevas líneas. La matriz de cadenas está vinculada al contenido de NSCollectionView a través de un controlador de matriz.

El archivo de punta de mi artículo está configurado correctamente, la vista de la raíz y la etiqueta tienen las Prioridades de resistencia al compresión de contenido y el abarcamiento de contenido de 1000, y los bordes están alineados mediante el Diseño automático.

Ahora, el método delegado de NSCollectionViewLayout tiene esta firma:

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

Mi idea ahora es tomar el artículo en sí mismo, ejecutar un pase de diseño sobre él y luego devolver el nuevo tamaño del artículo.

let item = collectionView.itemAtIndexPath(indexPath)! item.view.layout() return item.view.bounds.size

El problema con este enfoque es que itemAtIndexPath devuelve nil. Si devuelvo un tamaño predeterminado en el caso nulo, ese tamaño predeterminado se usa para todas las celdas.

¿Cómo puedo configurar NSCollectionView para que respete las restricciones de AutoLayout de mi artículo y para cada celda, use el tamaño calculado dinámicamente?