Неправильные рисунки в Cocoa с CoreGraphics в моем пользовательском NSSlider

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

NSSlider во время движения

Это код отрисовки (мой класс наследуется от 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));
}

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


person it-west.net    schedule 24.01.2016    source источник


Ответы (1)


параметр dirtyRect

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

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

person Willeke    schedule 24.01.2016