Пользовательский nsslidercell
-
10-10-2019 - |
Вопрос
Я как бы выполнил реализацию пользовательской ячейки слайдера, которая может нарисовать использование изображений для полосы прокрутки и ручки. Единственное препятствие, которое сейчас на пути, это это, когда я быстро перетаскиваю ручку, изображения испорчены. Я опубликовал снимок экрана.
Вот код:
#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;
}
И это решило проблему для меня