Pregunta

Tengo una NSCollectionView que contiene una colección de CustomViews. Inicialmente los azulejos subvistas en columnas y filas como una cuadrícula. entonces establecer la propiedad Columns en IB a 1, por lo que ahora sólo los muestra uno tras otro en filas. Sin embargo, a pesar de que mi CustomView es 400 píxeles de ancho, que está establecido en autoresize, la NSCollectionView es 400 píxeles de ancho, y es puesto a 1 columna, los subvistas se dibujan sobre 80px de ancho.

Sé que puedo evitar esto llamando a:

CGFloat width = collectionView.bounds.size.width;
NSSize size = NSMakeSize(width, 85);
[collectionView setMinItemSize:size];
[collectionView setMaxItemSize:size];

Pero poner este código en el método awakeFromNib de mi WindowController sólo establece la anchura correcta cuando se lance el programa. Cuando cambio el tamaño de la ventana (y los autoresizes NSCollectionView como he especificado), la estancia en su CustomViews inicialmente establecer anchura.

Estoy feliz de tener cuidado de cambiar el tamaño de las subvistas mí mismo si es necesario, pero soy bastante nuevo en Cacao y parece que no puede encontrar artículos que explican cómo hacer tal cosa. ¿Puede alguien me punto en la dirección correcta?

Anthony

¿Fue útil?

Solución

maravilloso blog de Matt Gallagher cacao con Amor es sobre para hacer frente a esto. Esta semana, compartió las encuadernaciones detalles de una vista de una sola columna como la que nos ocupa:

http://cocoawithlove.com/2010/03/designing -view-con-bindings.html

Ficha siguiente, se compromete a compartir el resto de la aplicación, que lo que está buscando debe dar.

(Debo señalar que se subclassing NSView directamente y volver a poner en práctica muchas de las características de NSCollectionView Esto parece ser común, aunque,.. No muchas personas les gusta la subclasificación NSCollectionView)

Editar Parece que rompió su promesa ... nunca hubiera recibido dicho mensaje. Ver tofutim de respuesta a continuación en su lugar.

Otros consejos

La verdadera respuesta es establecer la MaxItemSize a 0,0 (NSZeroSize). De lo contrario, se calcula.

[self.collectionView setMaxItemSize:NSZeroSize];

Esto se puede configurar en awakeFromNib.

Sé que esto es un muy respuesta tardía pero tengo el mismo problema y espero que mi solución ayudará a alguien. La solución es límites de acceso de encerrar vista de desplazamiento no de sí misma vista de colección. Así que para resolverlo es necesario sustituir la primera línea:

CGFloat width = collectionView.enclosingScrollView.bounds.size.width;

No podía conseguir que esto funcione con una disposición predeterminada - pero es bastante fácil de implementar un diseño personalizado:

/// Simple single column layout, assuming only one section
class SingleColumnLayout: NSCollectionViewLayout {

    /// Height of each view in the collection
    var height:CGFloat = 100

    /// Padding is wrapped round each item, with double an extra bottom padding above the top item, and an extra top padding beneath the bottom
    var padding = EdgeInsets.init(top: 5, left: 10, bottom: 5, right: 10)

    var itemCount:Int {
        guard let collectionView = collectionView else {
            return 0
        }

        return collectionView.numberOfItems(inSection:0)
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: NSRect) -> Bool {
        return true
    }

    override open func layoutAttributesForItem(at indexPath: IndexPath) -> NSCollectionViewLayoutAttributes? {
        let attributes = NSCollectionViewLayoutAttributes(forItemWith: indexPath)
        guard let collectionView = collectionView else {
            return attributes
        }

        let bounds = collectionView.bounds
        let itemHeightWithPadding = height + padding.top + padding.bottom
        let row = indexPath.item

        attributes.frame = NSRect(x: padding.left, y: itemHeightWithPadding * CGFloat(row) + padding.top + padding.bottom , width: bounds.width - padding.left - padding.right , height: height)
        attributes.zIndex = row

        return attributes
    }

    //If you have lots of items, then you should probably do a 'proper' implementation here
    override open func layoutAttributesForElements(in rect: NSRect) -> [NSCollectionViewLayoutAttributes] {
        var attributes = [NSCollectionViewLayoutAttributes]()

        if (itemCount>0){
            for index in 0...(itemCount-1) {
                if let attribute = layoutAttributesForItem(at: NSIndexPath(forItem: index, inSection: 0) as IndexPath) {
                    attributes.append(attribute)
                }
            }
        }

        return attributes
    }

    override open var collectionViewContentSize: NSSize {

        guard let collectionView = collectionView else {
            return NSSize.zero
        }

        let itemHeightWithPadding = height + padding.top + padding.bottom

        return NSSize.init(width: collectionView.bounds.width, height: CGFloat(itemCount) * itemHeightWithPadding + padding.top + padding.bottom )
    }
}

entonces todo lo que necesita es

var layout=SingleColumnLayout()
collectionView.collectionViewLayout = layout

otra tarde una - que acaba de cambiar al uso de un NSTableView y proporcionar una NSView por el método delegate

.

tamaño automático viene de forma gratuita, una columna es fácil, y se hace de forma masiva más rápido.

Digamos que usted quiere que su CollectionViewItem con un tamaño de 200x180px, a continuación, se debe establecer:

[myCollectionView setMinItemSize:NSMakeSize(200, 180)];
[myCollectionView setMaxItemSize:NSMakeSize(280, 250)];

Su-Max tamaño debe ser lo suficientemente grande como para quedar bien y dar suficiente espacio para estirar para adaptarse a la CollectionView de ancho.

Si usted tiene un número fijo de columnas, es probable que pueda utilizar (0,0), pero si quieres una serie dinámica de filas y columnas como yo quería .. debe establecer un mínimo de tamaño fijo y un máximo más grande .size.

Si bien es posible obtener una vista de colección a comportarse como quiera, yo creo que hay un problema de diseño

Se debe utilizar un NSTableView y columnas a 1 y su tamaño para cualquier cosa menos "Ninguno". NSTableView está destinado para datos tabulares, además de que se puede reciclar las celdas que le da un gran aumento de rendimiento para la gran cantidad de artículos. NSCollectionView es más como una disposición lineal que organiza los elementos en una cuadrícula, con desplazamiento vertical. Es útil cuando el número de columna se puede cambiar dinámicamente para permitir que más elementos que se muestran en la pantalla, por lo general en función de la orientación del dispositivo y tamaño de la pantalla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top