9
votes

NscollectionView a-t-il auto-arônier la largeur de ses sous-espions pour afficher une colonne

J'ai un NSCollectionview contenant une collection de Custom Views . Initialement, il a carré des sous-espions dans des colonnes et des rangées comme une grille. J'ai ensuite défini la propriété colonnes de IB à 1, alors cela les affiche simplement l'une après l'autre en rangées. Cependant, même si mon Customview est de 400px de large, il est défini sur AutoFeize, le NSCollectionview est de 400px de large et il est défini sur 1 colonne, les sous-espions sont tirés d'environ 80px de large.

Je sais que je peux me contourner en appelant: xxx

mais mettre ce code dans la méthode éraftfromnib de mon windowController < / code> définit uniquement la largeur correcte lorsque le programme lance. Lorsque je redimensionnement de la fenêtre (et le NSCollectionvoirview est automatiquement modifié comme indiqué), les valeurs personnalisées restent à leur largeur initialement définie.

Je suis heureux de veiller à redimensionner la Sousvishs moi-même si besoin d'être, mais je suis tout à fait nouveau au cacao et je ne peux pas sembler trouver des articles expliquant comment faire une telle chose. Quelqu'un peut-il me dire dans la bonne direction?

Anthony


2 commentaires

J'ai maintenant découvert que je peux définir ma fenêtreController pour être le délégué de la fenêtre et recevoir des notifications de redimensionnement via WindowDidResize. Donc, j'utilise maintenant le code ci-dessus à chaque fois que la fenêtre redimensionne pour définir les tailles d'élément max et min. Cela fonctionne bien au fur et à mesure que la fenêtre se développe, mais pour une raison quelconque l'augmentation de la taille des articles min / max, les limites de la collectionView ne se rétrécissent jamais, même lorsque la fenêtre le fait. Donc, même si la collectionView rétrécit visuellement lorsque je redimensionnez la fenêtre, ses limites ne le font jamais et là pour mes sous-espions ne le font pas non plus!


Avez-vous déjà trouvé un moyen de le faire automatiquement?


8 Réponses :


-5
votes

Blog de Matt Gallagher's Merveilleux Cocoa avec amour est à propos de pour remédier à ce. Cette semaine, il a partagé les détails de la liaison d'une vue à une colonne comme celle en question:

http://cocoawithlove.com/2010/03/Designing -View-with-windings.html

Entrée suivante, il promet de partager le reste de la mise en œuvre, ce qui devrait vous donner ce que vous recherchez.

(Je dois noter qu'il est sous-classement Nsview directement et réémunération de nombreuses fonctionnalités de Nscollectionview. Cela semble être courant cependant; peu de gens ontime le sous-classement NSCollectionview.)

EDIT: semble qu'il a cassé sa promesse ... Nous n'avons jamais reçu ce post. Voir la réponse de Tofutim ci-dessous à la place.


0 commentaires

3
votes

Je sais que c'est une réponse tardif très forte>, mais j'ai eu le même problème et j'espère que ma solution aidera quelqu'un. La solution consiste à accéder aux limites de la vue de défilement enfermante non de la visualisation de la collection elle-même. Donc, pour résoudre ce problème, vous devez remplacer la première ligne avec:

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


2 commentaires

Où est l'ensemble de la largeur?


J'ai essayé de la définir avec éveakfromnib - environ 60% du temps, cela fonctionne - mais étrangement dans l'autre 40% du temps, la ClaquecrollieView a 0 largeur. J'ai l'impression que Xcode est en quelque sorte cache quelque chose et cela finit par restaurer la pointe sans la construire correctement.



9
votes

La réponse vraie consiste à définir la maxitemise sur 0,0 ( nszerosize code>). Sinon, il est calculé.

[self.collectionView setMaxItemSize:NSZeroSize];


1 commentaires

C'est tellement simple et cela fait exactement ce dont j'avais besoin. Les articles de ma vision de la collection redimensionnent maintenant avec la vue de la collection, tout comme j'avais l'intention de l'intention.



1
votes

Un autre tard, je viens de passer à l'aide d'un NSTableView et fournissant un Nsview par la méthode

Autorésisateur est livré gratuitement, une colonne est facile et elle rend massivement plus rapide.


0 commentaires

0
votes

permet de dire que vous voulez que votre collectionViewItem d'une taille de 200x180px, vous devez définir:

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


0 commentaires

0
votes

Pendant que vous pourriez obtenir une vue de collection pour se comporter comme vous le souhaitez, je pense que vous avez un problème de conception

Vous devez utiliser un NSTableView et définir des colonnes sur 1 et leur dimensionnement sur quoi que ce soit, mais "aucun". NSTableView est destiné aux données tabulaires, plus il peut recycler les cellules qui permettent une excellente performance pour une grande quantité d'articles. NSCollectionView ressemble plus à une disposition linéaire qui organise des éléments dans une grille, avec défilement vertical. Il est utile lorsque le numéro de colonne peut modifier de manière dynamique pour permettre l'affichage de plusieurs éléments à l'écran, généralement en fonction de l'orientation du périphérique et de la taille de l'écran.


1 commentaires

Il y a 5% de cas où ce n'est pas un problème de conception. Mon cas NSTableView n'aime pas NsdatePicker ses rangées. NsoutLineView fonctionne hors de la boîte.



2
votes

Je n'ai pas pu obtenir cela pour travailler avec une mise en page par défaut - mais il est assez facile d'implémenter une mise en page personnalisée: xxx pré>

alors tout ce dont vous avez besoin est P>

var layout=SingleColumnLayout()
collectionView.collectionViewLayout = layout


0 commentaires

0
votes

J'ai essayé toutes les solutions proposées ici et aucun d'entre eux n'a contribué. Si vous utilisez la mise en page de flux (il est utilisé par défaut), vous pouvez l'étendre avec le code suivant et la méthode TIGNFORITEM de la déléguée sera appelé à chaque modification

class MyCollectionViewFlowLayout: NSCollectionViewFlowLayout {

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

    override func invalidationContext(forBoundsChange newBounds: NSRect) -> NSCollectionViewLayoutInvalidationContext {
       let context = super.invalidationContext(forBoundsChange: newBounds) as! NSCollectionViewFlowLayoutInvalidationContext
       context.invalidateFlowLayoutDelegateMetrics = true
       return context
    }
}


0 commentaires