2017-02-14 1 views
1

J'essaie de créer un NSCollectionView où ses éléments s'adaptent à l'espace disponible plutôt que de définir une taille fixe pour les éléments et de redimensionner NSCollectionView en conséquence.Redimensionner automatiquement NSCollectionViewItem pour l'adapter à l'écran

Je ne pouvais pas trouver un moyen d'atteindre cet objectif avec NSCollectionViewFlowLayout, car il nécessite une taille fixe pour ses éléments. Je suis venu assez près du résultat souhaité avec le NSCollectionViewGridLayout. Cependant, j'ai besoin que les éléments CollectionViewItems conservent leurs proportions (carrés) lors de la mise à l'échelle de la fenêtre qui contient NSCollectionView, alors que GridLayout les met à l'échelle en fonction de leurs valeurs min et maxItemSize. Selon la taille de la fenêtre et le nombre d'objets dans la collection, je finis avec des objets qui ne sont pas exactement des carrés.

Exemple capture d'écran: distorted NSCollectionViewItems

Je pourrais probablement travailler autour de cela avec le réglage des maximumNumberOfColumns dans la grille, en fonction du nombre d'articles de la collection et la taille de la fenêtre, mais il semble être un peu lourd. Existe-t-il un meilleur moyen d'obtenir la disposition souhaitée? Peut-être avec un NSCollectionViewLayout personnalisé?

Répondre

1

Vous devez mettre en œuvre le protocole suivant dans votre contrôleur:

NSCollectionViewDelegateFlowLayout 

Il a beaucoup de méthodes permettant objets de réglage fin (taille/position/marges). N'oubliez pas de définir votre disposition de vue de collection pour être "flux" (dans IB).

Rechercher la mise en œuvre des méthodes suivantes:

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 { 
    ... 
} 
+0

Cela signifierait pour calculer la taille des cellules en fonction de la taille de la fenêtre et la quantité d'articles, non? Il n'y a pas de "mise en page automatique" pour cela? – rooney

+0

Correct. Il n'y a pas de mise en page automatique pour ces détails. Je souhaite qu'ils aient fait un peu plus de CSS-flexbox. –