Può NSCollectionView ridimensiona automaticamente la larghezza della sua secondarie di visualizzare una colonna

StackOverflow https://stackoverflow.com/questions/2107755

Domanda

Ho un NSCollectionView che contiene una raccolta di CustomViews.Inizialmente si piastrellati sottoview in colonne e righe, come una griglia.Ho poi impostato il Columns proprietà in IB 1, così ora è appena visualizzate una dopo l'altra a righe.Tuttavia, anche se il mio CustomView è 400px di larghezza, è impostato per l'autoresize, il NSCollectionView è 400px di larghezza, ed è impostato a 1, colonna, le secondarie sono tirati su 80px ampia.

So che posso ottenere intorno a questo, chiamando:

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

Ma mettendo questo codice awakeFromNib metodo di mio WindowController imposta solo la larghezza corretta quando il programma si avvia.Quando ho ridimensionare la finestra (e il NSCollectionView autoresizes come ho specificato), il CustomViews rimanere al loro inizialmente impostare la larghezza.

Sono felice di prendersi cura di ridimensionamento sottoview me, se è necessario, ma io sono abbastanza nuovo di Cacao e non riesco a trovare un articolo che spiega come fare una cosa del genere.Qualcuno può mi punto nella giusta direzione?

Antonio

È stato utile?

Soluzione

Matt Gallagher meraviglioso blog Cacao con Amore è circa per affrontare questo.Questa settimana, ha condiviso le associazioni dettagli di una colonna di vista, come quello in questione:

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

La voce successiva, egli promette di condividere il resto della sua attuazione, che dovrebbe dare quello che stai cercando.

(Vorrei sottolineare che è una sottoclasse di NSView direttamente e re-implementazione di molte NSCollectionView caratteristiche.Questo sembra essere comune;non molte persone sono appassionato di sottoclassi di NSCollectionView.)

Edit: Sembra che egli ha rotto la sua promessa...non abbiamo mai fatto ricevere posta.Vedere tofutim la risposta qui sotto, invece.

Altri suggerimenti

La vera risposta è quella di impostare il MaxItemSize a 0,0 (NSZeroSize). Altrimenti, viene calcolato.

[self.collectionView setMaxItemSize:NSZeroSize];

Questa può essere impostata in awakeFromNib.

So che questo è un molto risposta in ritardo ma ho avuto lo stesso problema e spero che la mia soluzione aiuterà qualcuno. Soluzione è quella di accedere limiti della racchiude vista di scorrimento non di collezione vista stessa. Quindi, per risolverlo è necessario sostituire prima linea con:

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

non ho potuto ottenere questo a lavorare con un layout predefinito - ma è abbastanza facile da implementare un layout personalizzato:

/// 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 )
    }
}

allora tutto ciò che serve è

var layout=SingleColumnLayout()
collectionView.collectionViewLayout = layout

un'altra tarda - Ho appena passato a utilizzare un NSTableView e fornendo un NSView con il metodo delegate

.

il ridimensionamento automatico viene fornito gratuitamente, una colonna è facile, e rende più veloce in maniera massiccia.

Diciamo che si desidera che il CollectionViewItem con una dimensione di 200x180px, allora si dovrebbe impostare:

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

Il max-size dovrebbe essere abbastanza grande per guardare bene e dare abbastanza spazio per lo stretching per adattarsi alla CollectionView-Width.

Se si dispone di un numero fisso di colonne, probabilmente si può usare (0,0), ma se volete un numero dinamica di righe e colonne come volevo .. si dovrebbe impostare un min-dimensione fissa e una più grande max .size.

Mentre si potrebbe ottenere una visione raccolta di comportarsi come si vuole, penso che tu abbia un problema di progettazione

È necessario utilizzare un NSTableView e colonne impostato a 1 e il loro dimensionamento a tutt'altro che "Nessuno". NSTableView è destinato per i dati tabulari, più esso può riciclare le cellule che dà un grande incremento delle prestazioni per la grande quantità di oggetti. NSCollectionView è più simile a una disposizione lineare che organizza gli elementi in una griglia, con scorrimento verticale. È utile quando il numero di colonna può cambiare dinamicamente per consentire più articoli da essere visualizzati sullo schermo, di solito a seconda dell'orientamento del dispositivo e le dimensioni dello schermo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top