2010-11-21 40 views
7

Y at-il un moyen de superposer le NSScroller sur le contenu de la vue déroulante (comme dans iOS)? Je l'ai déjà essayé plusieurs approches:Superposer NSScroller sur le contenu

a) fixant le cadre de la vue du contenu de vue de défilement (NSClipView) pour se prolonger dans les limites de la barre de défilement

b) ajouter un objet NSScroller comme sous-vue de la vue de défilement (positionnai où je veux)

c) créer une vue changeurs entièrement sur mesure et en le plaçant comme un sous-vue (cela a fonctionné, mais cela voudrait dire que je dois réécrire toutes les fonctionnalités de NSScroller)

Sparrow semble réussir à le faire, et il semble le faire à travers une sous-classe NSScroller régulière (vu qu'il répond aux paramètres de défilement définis dans Préférences Système >> Apparence). Ce n'est pas vraiment le dessin qui pose le problème, c'est juste de superposer le contenu.

Tout conseil est apprécié :-)

Répondre

4

Voici ma solution: Créer une classe MyScroller qui s'étend NSScroller

Dans le MyScroller.m:

#import "MyScroller.h" 


@implementation MyScroller 

+(CGFloat) scrollerWidth{ 
    return 10; 
} 

+(CGFloat) scrollerWidthForControlSize:(NSControlSize)controlSize{ 
    return 10; 
} 

- (void) drawBackground:(NSRect) rect{ 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:0 yRadius:0]; 
    [[NSColor whiteColor] set]; 
    [path fill]; 
} 

- (void)drawKnob{ 
    [self drawBackground:[self rectForPart:0]]; 
    [self drawBackground:[self rectForPart:1]]; 
    [self drawBackground:[self rectForPart:2]]; 
    [self drawBackground:[self rectForPart:4]]; 
    [self drawBackground:[self rectForPart:5]]; 
    [self drawBackground:[self rectForPart:6]]; 


    NSRect knobRect = [self rectForPart:NSScrollerKnob]; 
    NSRect newRect = NSMakeRect((knobRect.size.width - [MyScroller scrollerWidth])/2, knobRect.origin.y, [MyScroller scrollerWidth], knobRect.size.height); 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:newRect xRadius:5 yRadius:5]; 
    [[NSColor grayColor] set]; 
    [path fill]; 
} 
@end 

Ensuite, il suffit de définir la catégorie personnalisée pour la roulette de défilement dans Interface Builder.

+0

Avec cette solution il n'y a aucun moyen de masquer automatiquement la barre de défilement à travers la propriété concernée. – loretoparisi