2010-01-04 3 views
1

J'ai créé un NSScrollView qui contient lui-même une vue NSClippedView en tant que contenu (tout est par défaut, créé par IB). Dans la vue de contenu, il y a la vue de document (par défaut).NSScrollView n'affiche pas la barre de défilement verticale après l'ajout de contenu

Cette fonction NSScrollView est dotée d'une fonction de défilement horizontale désactivée et verticale activée et, plus important encore, de défileurs de masquage automatique activés. Lorsque j'ajoute de nouvelles vues (via le code, l'exécution) à la vue du document, le défileur ne se masque pas automatiquement jusqu'au moment où je redimensionne verticalement la fenêtre (et redimensionne à son tour la vue défilante). 1px est suffisant. Juste la nouvelle peinture de la fenêtre semble suffisante. Ce que je cherche est de déclencher ceci par le code: ainsi quand j'ajoute des vues à la vue de contenu de scrollviews je voudrais que la barre de défilement apparaisse.

int numberOfChildViews = 10; //hard coded for example here 
int childViewHeight = 80; //same as above 

NSRect rect = NSMakeRect(0, 0, [[self.scrollView contentView] bounds].size.width, [numberOfChildViews*childViewHeight); 
[[self.scrollView documentView] setFrame:rect]; 
[[self.scrollView documentView] setBounds:rect]; //just added to make sure 

Puis j'ai ajouté les vues personnalisées à la vue du document, comme:

for (int i=0; i<numberOfChildViews; i++) { 
    NZBProgressViewController *item = [nzbProgressArray objectAtIndex:i]; 

    int y=i*[[item view] bounds].size.height; 
    rect= NSMakeRect(0, y, [[scrollView contentView] frame].size.width, [[item view] bounds].size.height); 

      [[item view] setFrame:rect]; 
    currentPosition++; 
} 

J'utilise un FlippedView donc l'origine sera affiché dans gaucheen haut, comme ceci:

@interface NSFlippedClipView : NSClipView { 
} 

@implementation NSFlippedClipView 
- (BOOL)isFlipped { 
    return YES; 
} 

- (BOOL)isOpaque { 
    return YES; 
} 
@end 

et a ajouté le code suivant à la awakeFromNib

NSFlippedClipView *documentView = [[NSFlippedClipView alloc] init]; 
[documentView setAutoresizingMask:NSViewWidthSizable]; 
[documentView setBackgroundColor:[self.scrollView backgroundColor]]; 

[self.scrollView setDocumentView:documentView]; 
[documentView release]; 

Répondre

1

Ahh, c'est ma propre mauvaise. Pour référence future: si vous souhaitez déplacer l'origine (0,0) vers le haut à gauche, utilisez un NSView au lieu de la classe étendue NSClippedView avec la méthode IsFlipped surchargée à YES.

Merci d'avoir répondu.

1

Les barres de défilement doivent être visibles dès que l'affichage du document est redimensionné pour être plus grand que la fenêtre d'affichage actuelle de l'affichage déroulant. Redimensionnez-vous l'affichage du document lorsque vous ajoutez vos sous-vues?

+0

Merci d'avoir répondu. Je vais poster le code ce soir. Ce que je fais est: pendant awakefromnib est mis la vue du document de la scrollview à une surcharge personnalisée de nsclipview, seule la méthode surchargée est IsFlipped, cela se traduira par OUI pour faire l'origine de haut en bas. Cette vue que j'ai appelée NSFlippedClipView Lors de l'ajout de contenu dynamique à la vue du document, je redimensionne la vue du document à: taille verticale de la vue (qui est la "fenêtre" sur le documentview) et le nombre de vues personnalisées hauteur des vues personnalisées. Ce qui semble fonctionner correctement. –

+0

Ceci est une bonne réponse car il n'est pas clair dans la documentation si la vue du document doit être redimensionnée manuellement lors de l'ajout de sous-vues. – Dalmazio

Questions connexes