2016-01-24 4 views
0

Мне нужно пересмотреть некоторые элементы управления. Нет проблемы с NSButton, но NSSlider имеет ошибки рисования, пока я держу мышь и перемещаю ручку. Если я отпущу мышь, она рисует правильно.Неисправные рисунки в какао с CoreGraphics на моем обычном NSSlider

NSSlider while moving around

Это код рисования (мой класс наследует от NSSlider):

- (void)drawRect:(NSRect)dirtyRect 
{ 
    //[super drawRect:dirtyRect]; 
    CGContextRef c; 
    CGFloat y, r, p; 

    c = [[NSGraphicsContext currentContext] graphicsPort]; 
    r = (dirtyRect.size.height*0.8)/2.0; 
    p = (dirtyRect.size.width-r*2) * ([self doubleValue]*0.01); 
    y = dirtyRect.size.height/2.0; 

    CGContextSetLineWidth(c, 2); 
    CGContextSetStrokeColorWithColor(c, [_fullLineColor CGColor]); 
    CGContextMoveToPoint(c, 0, y); 
    CGContextAddLineToPoint(c, dirtyRect.size.width, y); 
    CGContextStrokePath(c); 

    CGContextSetLineWidth(c, 5); 
    CGContextSetStrokeColorWithColor(c, [_valueLineColor CGColor]); 
    CGContextMoveToPoint(c, 0, y); 
    CGContextAddLineToPoint(c, p, y); 
    CGContextStrokePath(c); 

    CGContextSetFillColorWithColor(c, [_knobColor CGColor]); 
    CGContextFillEllipseInRect(c, CGRectMake(p, y-r, r*2, r*2)); 
} 

Что я могу сделать, чтобы избежать этого?

ответ

2

параметр dirtyRect

прямоугольник, определяющий часть зрения, которая требует перерисовки. Этот прямоугольник обычно представляет часть представления, которая требует обновления. Когда включена гибкая прокрутка, этот прямоугольник также может представлять собой невидимую часть представления, которое AppKit хочет кэшировать.

Вы управляете контроллером dirtyRect. Вы должны нарисовать (часть dirtyRect) элемента управления в self.bounds. Подробнее о documentation of drawRect:

+0

хорошо. Спасибо! –