Подкласс NSScroller не рисование - PullRequest
4 голосов
/ 20 июня 2011

У меня есть NSScrollView, и я хотел бы знать, когда пользователь mouseDown находится на его NSScroller. При использовании подкласса NSScroller (для переопределения mouseDown) горизонтальный скроллер моего NSScrollView больше не рисуется / не виден. Если я переопределяю drawRect моего NSScroller (и использую его суперпредставление для рисования), он вызывается с ожидаемым NSRect, но ничего не рисуется. Чего мне не хватает?

  • На самом деле, по-видимому, есть сегмент 15х15 вертикальной дорожки скроллера с правой стороны от ожидаемой области HScroller. Может быть, мне нужно указать setFrameRotation или что-то ... хотя, если я вызываю NSFillRect в drawHect MyHScroller, он рисует ожидаемый прямоугольник - если я поверну на 90 градусов, моя заливка будет только 15x15 слева от ожидаемой области HScroller.

Вот мой код создания 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 с функциями, добавленными для синхронизации с прокруткой.

1 Ответ

0 голосов
/ 29 июня 2011

Простое решение ... есть недокументированный битовый флаг, который управляет ориентацией и поведением: sFlags.isHorz должен быть установлен в YES или NO в подклассе NSScroller.

Вот не обязательно рекомендуемый пример использованияsetFrame: переопределить:

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