2011-06-20 31 views
4

我有一个NSScrollView,我想知道当用户mouseDown在它的NSScroller。当使用NSScroller子类(重写mouseDown)时,我的NSScrollView的水平滚动条不再被绘制/可见。如果我重写了我的NSScroller的drawRect(并使用它的超视图来完成绘图),它会被预期的NSRect调用,但是没有任何东西被绘制。我错过了什么?NSScroller的子类没有绘制

  • 实际上,在预期的HScroller区域的右侧似乎有一个15x15的垂直滚动条轨道段。也许我需要指定setFrameRotation什么的......虽然如果我在MyHScroller的drawRect中调用NSFillRect,它会绘制预期的矩形 - 如果我旋转90度,我的填充只有预期HScroller区域左侧的15x15。

这里是我的NSScrollView创建代码:

MyHScroller *pMyHScroller = [[MyHScroller alloc] init]; 
MyScrollView *pMyScrollView = [[MyScrollView alloc] initWithFrame:nsrcFrame]; 
// pMyHScroller = nil; // With this line uncommented, the HScroller is drawn perfectly 
if (pMyHScroller) 
{ 
    [pMyScrollView setHorizontalScroller:pMyHScroller]; 
} 
[pMyScrollView setHasVerticalScroller: NO]; 
[pMyScrollView setHasHorizontalScroller: YES]; 
[pMyScrollView setAutohidesScrollers:  NO]; 
[pMyScrollView setBorderType: NSBezelBorder]; 
[pMyScrollView setAutoresizingMask:0|NSViewMinYMargin]; 

[pMyScrollView setHorizontalLineScroll: 10]; 
[pMyScrollView setHorizontalPageScroll: 100]; 
[pMyScrollView setScrollsDynamically: YES]; 

这里是NSScroller子类:

@interface MyHScroller : NSScroller 
{ 
} 
- (void)mouseDown:(NSEvent *)eventInfo; 
- (void)drawRect:(NSRect)nsrcDirty; 
@end 

@implementation MyHScroller // NSScroller 
- (void)mouseDown:(NSEvent *)eventInfo 
{ 
    [super mouseDown:eventInfo]; 
} 


- (void)drawRect:(NSRect)nsrcDirty 
{ 
    // This fills the expected HScoller area with yellow 
    [[NSColor yellowColor] set]; 
    NSRectFill(nsrcDirty); 

    // This verifies the ends of the rect are visible 
    { 
     [[NSColor cyanColor] set]; 
     NSBezierPath* aPath = [NSBezierPath bezierPath]; 
     [aPath moveToPoint:NSMakePoint(bounds.origin.x  , bounds.origin.y      )]; 
     [aPath lineToPoint:NSMakePoint(bounds.origin.x+20.0, bounds.origin.y+bounds.size.height/2.0)]; 
     [aPath lineToPoint:NSMakePoint(bounds.origin.x  , bounds.origin.y+bounds.size.height )]; 
     [aPath stroke]; 
    } 
    { 
     [[NSColor cyanColor] set]; 
     NSBezierPath* aPath = [NSBezierPath bezierPath]; 
     [aPath moveToPoint:NSMakePoint(bounds.origin.x+bounds.size.width  , bounds.origin.y      )]; 
     [aPath lineToPoint:NSMakePoint(bounds.origin.x+bounds.size.width-20.0, bounds.origin.y+bounds.size.height/2.0)]; 
     [aPath lineToPoint:NSMakePoint(bounds.origin.x+bounds.size.width  , bounds.origin.y+bounds.size.height )]; 
     [aPath stroke]; 
    } 

    // This draws what appears to be a 15x15 Vertical Scroller track segment 
    // over the right size of the yellow rect 
    [super drawRect:nsrcDirty]; 
} 

@end 

的MyScrollView只是一个NSScrollView覆盖添加了滚动同步等功能。

回答

0

简单解决方案...有一个未公开的位标来控制方向和行为:sFlags.isHorz需要在NSScroller子类中设置为YES或NO。

下面是一个使用SETFRAME一个不必然推荐的例子:覆盖:

-(void)setFrame:(NSRect)nsrcFrame 
{ 
    [super setFrame:nsrcFrame]; 
    sFlags.isHoriz = (nsrcFrame.size.width > nsrcFrame.size.height); // otherwise always draws vertically 
} 
+0

......虽然这并不在OSX 10.7(狮子)工作。在狮子,卷轴是垂直的。 – nubee