2010-11-21 19 views
7

Gibt es eine Möglichkeit, den NSScroller über den Inhalt der Bildlaufansicht (wie in iOS) zu überlagern? Ich habe bereits mehrere Ansätze versucht:Overlay NSScroller über Inhalt

a) den Rahmen der Bildlaufansicht Seiten (NSClipView) Einstellung in die Grenzen des Stellrad als

b) Zugeben eines NSScroller Objekts zu erweitern subview der Scroll-Ansicht (positioniert, wo ich will)

c) eine ganz individuelle scroller Ansicht erstellen und es als ein Subview platzieren (dies funktioniert, aber das würde bedeuten, dass ich die ganze Funktionalität von NSScroller neu schreiben müssen)

Sparrow scheint dies erfolgreich zu tun, und es scheint, es über eine reguläre NSScroller Unterklasse zu tun (zu sehen, wie es auf die Bildlaufeinstellungen in den Systemeinstellungen >> Aussehen reagiert). Es ist nicht wirklich das Zeichnen des Scrollers, das ist das Problem, es macht es nur überlagern den Inhalt.

Jede Beratung :-)

Antwort

4

Hier ist meine Lösung: eine MyScroller Klasse erstellen, die NSScroller

Im MyScroller.m erweitert:

#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 

Dann einfach die benutzerdefinierte Klasse für die Scroller im Interface Builder.

+0

Mit dieser Lösung gibt es keine Möglichkeit zum automatischen Ausblenden der Scrollbalken durch die damit verbundene Eigenschaft. – loretoparisi