Вопрос

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

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];
}

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

Это было полезно?

Решение

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

#import "customSlider.h"

@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
    [super setNeedsDisplayInRect:[self bounds]];
}
@end

Другие советы

Я новичок в 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];

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

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

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

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

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

- (BOOL)_usesCustomTrackImage {
return YES;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top