пользовательский NSSliderCell - PullRequest
       7

пользовательский NSSliderCell

8 голосов
/ 21 октября 2010

Я вроде как реализовал собственную ячейку слайдера, которая может рисовать, используя изображения для полосы прокрутки и ручки.Единственное препятствие, которое сейчас стоит на пути, это то, что, когда я быстро перетаскиваю ручку, изображения портятся.Я разместил снимок экрана.

Screenshot

Вот код:

#import "customSliderCell.h"
@implementation customSliderCell
- (void)drawKnob:(NSRect)knobRect {

    NSImage * knob = knobImage;
 [[self controlView] lockFocus];
 [knob
 compositeToPoint:NSMakePoint(knobRect.origin.x,knobRect.origin.y+knobRect.size.height)
 operation:NSCompositeSourceOver];

[[self controlView] unlockFocus];
}
- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped {
rect.size.height = 8;

    NSRect leftRect = rect;
    leftRect.origin.x=0;
    leftRect.origin.y=2;
    leftRect.size.width = knobrect.origin.x + (knobrect.size.width);
    [leftBarImage setSize:leftRect.size];
    [leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];

    NSRect rightRect = rect;
    rightRect.origin.x=0;
    rightRect.origin.y=2;
    rightRect.origin.x = knobrect.origin.x;
    [rightBarImage setSize:rightRect.size];
    [rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
}

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

Ответы [ 4 ]

13 голосов
/ 11 ноября 2010

Хорошо, так что это выяснилось.видимо, слайдер пытался быть умным и рисовать только там, где была ручка.так что, очевидно, мне приходится все время аннулировать прямоугольник путем переопределения setNeedsDisplayInRect в классе слайдера.

#import "customSlider.h"

@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
    [super setNeedsDisplayInRect:[self bounds]];
}
@end
4 голосов
/ 01 августа 2012

Я новичок в Objective-c.Я тоже столкнулся с этой проблемой!Вот решение, чтобы найти, что я провел два дня))) Сохранить и восстановить GraphicsState:

[NSGraphicsContext restoreGraphicsState];
//...
[leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
//...
[rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
[NSGraphicsContext saveGraphicsState];

Извините за плохой английский.

2 голосов
/ 21 октября 2010

Удалить все сообщения -lockFocus и -unlockFocus. Фреймворк позаботится о настройке контекста рисования перед отправкой -drawBarInside:flipped: или -drawKnob:.

Кроме того, вы не должны создавать какие-либо объекты в методе рисования.

1 голос
/ 21 октября 2010

Ха, это другая история.Нет, NSResponder прав, и вы должны удалить все элементы «lockFocus», однако эта проблема является результатом ползунка по умолчанию, нарисованного NSSliderCell где-то вне drawBarInside: flipped: flipped.Я также сталкивался с этой проблемой не так давно.

Вот обсуждение и решение: http://www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html, короче говоря, вы можете переопределить весь drawCell: inView: или использовать «грязный хакерский трюк»с переопределением частного метода.Лично я не люблю хаки, но в этом случае я сделал

- (BOOL)_usesCustomTrackImage {
return YES;
}

И это решило проблему для меня

...