2010-11-19 7 views
3

Je tente de créer une vue de style de grille (similaire à NSCollectionView), à l'exception de Core Animation. Je suis assez loin à travers, et la dernière chose importante à faire est d'implémenter le défilement.Utilisation de NSScrollView avec CALayer

Mon installation à ce jour est que j'ai une sous-classe NSView (couche soutenue), et lors de l'initialisation, il crée et ajoute la couche de grille comme une sous-couche de la couche principale de la vue. J'ai créé un CALayoutManager personnalisé pour la couche de grille qui organise ses sous-vues dans une formation de type grille. Comme prévu, lorsque j'ajoute des sous-couches à la couche de la grille, le gestionnaire de disposition est appelé et les couches sont positionnées automatiquement. Jusqu'à présent, tout fonctionne comme il se doit.

Le problème survient lorsque j'essaie d'utiliser un NSScrollView en tant que parent de ma vue personnalisée pour implémenter le défilement. Je l'ai configuré comme suit: J'ai créé ma vue personnalisée en tant que sous-vue du NSScrollView dans Interface Builder. Puis, dans ma classe de gestionnaire de disposition, j'ai ajouté une propriété delegate et lors de l'initialisation, ma sous-classe de vue se définit comme le délégué du gestionnaire de disposition. À la fin de la méthode layoutSublayersForLayer: du gestionnaire de disposition, j'appelle son délégué avec la méthode de délégation layoutManager:contentHeightChanged:. Voici la mise en œuvre de cette méthode dans ma NSView sous-classe:

- (void)layoutManager:(MyLayoutManager*)manager contentHeightChanged:(CGFloat)height; 
{ 
    CGFloat newHeight = [[self enclosingScrollView] contentSize].height; 
    if (height > newHeight) { 
     newHeight = height; 
    } 
    NSRect newFrame = [self frame]; 
    newFrame.size.height = newHeight; 
    [self setFrame:newFrame]; 
} 

Il est assez simple, il vérifie juste pour voir si la nouvelle hauteur est supérieure à la taille du contenu de la vue de défilement, et définit le cadre de vues avec le nouvelle hauteur.

Cela fonctionne dans une certaine mesure. Lorsque la vue est redimensionnée, elle dimensionne correctement l'image de la vue comme il se doit pour encapsuler toute la hauteur du contenu, ce qui permet d'afficher des barres de défilement. Le problème: les sous-couches de la gigue de la grille lorsque la vue est redimensionnée avec les barres de défilement visibles. Voici une vidéo montrant le problème:

http://vimeo.com/16987653

Comme vous pouvez le voir, il n'y a pas de problème lorsque les barres de défilement ne sont pas visibles (autrement dit, lorsque la hauteur du contenu s'inscrit dans les limites de la vue de défilement). Je peux confirmer que ce n'est pas un problème avec le gestionnaire de mise en page et traiter avec des colonnes simples, parce que j'ai testé la même chose sans la vue de défilement et il n'y a pas de tremblements.

Tout conseil est grandement apprécié.

Répondre

1

Résolu ce problème en retournant le système de coordonnées de la couche et de la vue (origine dans le coin supérieur gauche).

+8

Pourriez-vous donner un exemple de la façon dont vous l'avez fait? –