Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 定制NSSliderCell_Objective C_Xcode_Macos_Nsslider - Fatal编程技术网

Objective c 定制NSSliderCell

Objective c 定制NSSliderCell,objective-c,xcode,macos,nsslider,Objective C,Xcode,Macos,Nsslider,我想定制NSSliderCell,但我遇到了一个奇怪的问题 下面是它的外观(放大): 它画得不错,但当我给旋钮下药时,左栏开始看起来很奇怪(看起来旋钮的部分阴影是前一帧留下的): 一旦我停止给旋钮下药,滑块就会恢复正常 代码如下: @implementation VolumeSliderCell NSImage *knobImage = nil; NSImage *leftBarLeftCapImage = nil; NSImage *leftBarFillImage = nil; NSI

我想定制NSSliderCell,但我遇到了一个奇怪的问题

下面是它的外观(放大):

它画得不错,但当我给旋钮下药时,左栏开始看起来很奇怪(看起来旋钮的部分阴影是前一帧留下的):

一旦我停止给旋钮下药,滑块就会恢复正常

代码如下:

@implementation VolumeSliderCell

NSImage *knobImage = nil;
NSImage *leftBarLeftCapImage = nil;
NSImage *leftBarFillImage = nil;
NSImage *rightBarFillImage = nil;
NSImage *rightBarRightCapImage = nil;

- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
    knobImage = [NSImage imageNamed:@"volume_knob.png"];
    leftBarLeftCapImage = [NSImage imageNamed:@"volume_leftbar_leftcap.png"];
    leftBarFillImage = [NSImage imageNamed:@"volume_leftbar_fill.png"];
    rightBarFillImage = [NSImage imageNamed:@"volume_rightbar_fill.png"];
    rightBarRightCapImage = [NSImage imageNamed:@"volume_rightbar_rightcap.png"];
}

return self;
}

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
//NSRect cellFrame = [self controlView].bounds;
//[[self controlView] setNeedsDisplayInRect:cellFrame];

[self drawBarInside:cellFrame flipped:[controlView isFlipped]];
[self drawKnob:cellFrame];
}

- (void)drawKnob:(NSRect)knobRect
{
[NSGraphicsContext saveGraphicsState];

CGRect bounds = [self controlView].bounds;
CGFloat value = ([self doubleValue]  - [self minValue])/ ([self maxValue] - [self minValue]);
CGRect rect = CGRectMake(value * (bounds.size.width - [knobImage size].width), (bounds.size.height - [knobImage size].height) / 2, [knobImage size].width, [knobImage size].height);

[knobImage drawInRect:CGRectIntegral(rect)];

[NSGraphicsContext restoreGraphicsState];
}

- (void)drawBarInside:(NSRect)aRect flipped:(BOOL)flipped
{
[NSGraphicsContext saveGraphicsState];

CGRect bounds = [self controlView].bounds;
CGFloat value = ([self doubleValue]  - [self minValue])/ ([self maxValue] - [self minValue]);
CGRect leftRect = CGRectMake([knobImage size].width / 2, (bounds.size.height - [leftBarFillImage size].height) / 2, value * (bounds.size.width - [knobImage size].width), [leftBarFillImage size].height);
CGRect rightRect = CGRectMake(leftRect.origin.x + leftRect.size.width, (bounds.size.height - [leftBarFillImage size].height) / 2, bounds.size.width - (leftRect.origin.x + leftRect.size.width + [knobImage size].width / 2), [leftBarFillImage size].height);

if (rightRect.size.width < 0)
{
    rightRect.size.width = 0;
}

NSDrawThreePartImage(CGRectIntegral(leftRect), leftBarLeftCapImage, leftBarFillImage, nil, NO, NSCompositeSourceOver, 1.0, YES);
NSDrawThreePartImage(CGRectIntegral(rightRect), nil, rightBarFillImage, rightBarRightCapImage, NO, NSCompositeSourceOver, 1.0, YES);

[NSGraphicsContext restoreGraphicsState];
}
@implementation VolumeSliderCell
NSImage*knobImage=nil;
NSImage*leftBarLeftCapImage=nil;
NSImage*leftBarFillImage=nil;
NSImage*rightBarFillImage=nil;
NSImage*rightBarRightCapImage=nil;
-(id)initWithCoder:(NSCoder*)编码器
{
self=[super initWithCoder:coder];
如果(自我){
knobImage=[NSImage imageNamed:@“volume_nub.png”];
leftBarLeftCapImage=[NSImage ImageName:@“volume_leftbar_leftcap.png”];
leftBarFillImage=[NSImage ImageName:@“volume_leftbar_fill.png”];
rightBarFillImage=[NSImage ImageName:@“volume_rightbar_fill.png”];
rightBarRightCapImage=[NSImage ImageName:@“volume_rightbar_rightcap.png”];
}
回归自我;
}
-(无效)drawWithFrame:(NSRect)查看中的单元格框架:(NSView*)控制视图
{
//NSRect cellFrame=[self-controlView].bounds;
//[[self-controlView]setNeedsDisplayInRect:cellFrame];
[self-Draprinside:cellFrame翻转:[controlView已翻转]];
[自拉旋钮:cellFrame];
}
-(无效)绘图旋钮:(NSRect)knobRect
{
[NSGraphicsContext saveGraphicsState];
CGRect边界=[self-controlView].bounds;
CGFloat值=([self doubleValue]-[self minValue])/([self maxValue]-[self minValue]);
CGRect rect=CGRectMake(值*(bounds.size.width-[knobImage size].width),(bounds.size.height-[knobImage size].height)/2[knobImage size].width[knobImage size].height);
[knobImage drawInRect:CGRectIntegral(rect)];
[NSGraphicsContext restoreGraphicsState];
}
-(无效)牵引杆侧:(NSRect)被翻转:(BOOL)翻转
{
[NSGraphicsContext saveGraphicsState];
CGRect边界=[self-controlView].bounds;
CGFloat值=([self doubleValue]-[self minValue])/([self maxValue]-[self minValue]);
CGRect leftRect=CGRectMake([KnobiImage size].width/2,(bounds.size.height-[leftBarFillImage size].height)/2,值*(bounds.size.width-[KnobiImage size].width),[leftBarFillImage size].height);
CGRect rightRect=CGRectMake(leftRect.origin.x+leftRect.size.width,(bounds.size.height-[leftBarFillImage size].height)/2,bounds.size.width-(leftRect.origin.x+leftRect.size.width+[knobImage size].width/2),[leftBarFillImage size].height];
if(righrect.size.width<0)
{
rightRect.size.width=0;
}
NSDrawThreePartImage(CGRectIntegral(leftRect)、leftBarLeftCapImage、leftBarFillImage、nil、NO、NSCompositeSourceOver、1.0、YES);
NSDrawThreePartImage(CGRectIntegral(rightRect),nil,rightBarFillImage,rightBarRightCapImage,否,NSCompositeSourceOver,1.0,是);
[NSGraphicsContext restoreGraphicsState];
}

怎么了?

顺便说一下,如果我取消注释[[self-controlView]setNeedsDisplayInRect:cellFrame];一切正常,只是开始时几乎没有延迟。在setDisplayInRect中记录您正在绘制的帧:-可能您只是在重新绘制滑块rect的一小部分,因此在其余部分,工件保持绘制状态。我会解释你的图像。