2010-11-21 22 views
7

¿Hay alguna manera de superponer el NSScroller sobre el contenido de la vista de desplazamiento (como en iOS)? Ya lo he intentado varios enfoques:Overlay NSScroller sobre contenido

a) El marco de la vista ver el contenido de desplazamiento (NSClipView) para extenderse dentro de los límites de la barra de desplazamiento

b) añadir un objeto como un NSScroller subvista de la vista de desplazamiento (coloqué donde quiero)

c) crear una vista desplazador completamente personalizada y colocándola como una subvista (esto funcionó, pero eso significaría que tengo que volver a escribir toda la funcionalidad de NSScroller)

Sparrow parece hacer esto con éxito, y parece hacerlo a través de una subclase NSScroller normal (ya que responde a la configuración de desplazamiento establecida en Preferencias del sistema >> Aspecto). En realidad, no se trata de dibujar el desplazamiento, sino de superponer el contenido.

Cualquier consejo se agradece :-)

Respuesta

4

Aquí está mi solución: crear una clase que se extiende MyScroller NSScroller

En el 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 

Entonces acaba de establecer la clase personalizada para la rueda de desplazamiento en el Interface Builder.

+0

Con esta solución no hay manera de ocultar automáticamente las barras de desplazamiento a través de la propiedad relacionada. – loretoparisi

Cuestiones relacionadas