8

我已经实现了一个自定义滑块单元格,它可以使用滚动条和旋钮的图像进行绘制。现在唯一的障碍是,当我快速拖动旋钮时,图像会变得混乱。我已经发布了一个屏幕截图。

截屏

这是代码:

#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

4 回答 4

13

好的,所以它想通了。显然,滑块试图变得聪明,只在旋钮所在的位置绘制。所以显然我必须通过覆盖滑块类中的 setNeedsDisplayInRect 来使矩形无效。

#import "customSlider.h"

@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
    [super setNeedsDisplayInRect:[self bounds]];
}
@end
于 2010-11-11T08:56:39.293 回答
4

我是 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];

抱歉英语不好。

于 2012-08-01T10:08:27.000 回答
2

删除所有-lockFocus-unlockFocus消息。-drawBarInside:flipped:该框架将在发送之前或 -drawKnob:曾经为您设置绘图上下文。

此外,您不应该在 draw 方法中创建任何对象。

于 2010-10-21T10:40:10.980 回答
1

哈,这是另一个故事。不,NSResponder 是对的,您应该删除所有“lockFocus”内容,但是,此问题是 NSSliderCell在 drawBarInside:flipped:flipped之外某处绘制的默认滑块的结果。不久前我也遇到过这个问题。

这是讨论和解决方案:http: //www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html,简而言之,您可以覆盖整个drawCell:inView:或使用“脏hack 技巧”,覆盖私有方法。我个人不喜欢黑客,但在这种情况下我喜欢

- (BOOL)_usesCustomTrackImage {
return YES;
}

它为我解决了问题

于 2010-10-21T14:35:40.333 回答