- [NSButton setImage:]仅在第一次调用时重绘

时间:2015-04-30 20:49:16

标签: macos cocoa nsbutton

我正在使用基于视图的NSTableView,它使用自定义单元格视图,其中包含多个控件。其中一个控件是仅图像NSButton,它可以显示复选标记图像,也可以根本不显示图像。此外,当我将鼠标悬停在其中一个没有图像的按钮上时,我希望在鼠标位于按钮内时显示复选标记图像的“褪色”版本。

我已使用NSTrackingArea设置代码以响应-mouseEntered:-mouseExited:事件,在NSButton上调用-setImage:以显示褪色的复选标记,同时鼠标位于按钮内,然后在鼠标退出时将图像设置为nil。

据我所知,所有代码似乎都按预期工作,但是当按钮更新并显示复选标记图像时,第一次鼠标进入视图,然后消失时它退出,第二次将鼠标移回按钮不会导致按钮重绘由于某种原因,无论图像设置多少次,它都会在第一次重绘后保持空白。

这是相关代码的摘要:

- (void)refreshActiveButton
{
    self.activeButton.image = self.activeImage;
}

- (void)mouseEntered:(NSEvent *)theEvent
{
    NSLog(@"mouse entered %@", self.listItem.name);
    self.mouseOverActiveButton = YES;
    [self refreshActiveButton];
}

- (void)mouseExited:(NSEvent *)theEvent
{
    NSLog(@"mouse exited %@", self.listItem.name);
    self.mouseOverActiveButton = NO;
    [self refreshActiveButton];
}

- (NSImage*)activeImage
{
    NSLog(@"returning new active image");
    if (self.listItem.isActive)
        return [NSImage imageNamed:@"checkmark16"];
    else if (self.mouseOverActiveButton)
        return fadedCheckmark;
    else
        return nil;
}

该按钮在.xib文件中设置为“瞬间推入”(我也尝试过“瞬间更改” - 相同的行为),没有显示标题且没有边框。

在调试器中运行,我已经确认:

  • 将鼠标移到按钮上时,即使显示屏未更新,也会继续调用-mouseEntered:-mouseExited:方法。
  • 正在为按钮分配正确的图像,并在设置后从按钮实例返回。 (当鼠标在里面时为fadedCheckmark图像,在鼠标在外面时为nil)

我在分配图像后尝试在按钮上调用-setNeedsDisplay:YES,并设置layerContentRedrawPolicy NSViewLayerContentsRedrawOnSetNeedsDisplay(整个表视图是图层支持的),行为没有变化。编辑:也尝试完全禁用图层支持,没有任何更改。

我觉得必须有一些明显的东西让我盯着我失踪,但如果有人能让我知道,我会很感激。

1 个答案:

答案 0 :(得分:0)

简短回答:这是一个错误!我已将其作为雷达20774731提交给Apple,并在http://openradar.appspot.com/radar?id=4957762287042560

打开Radar

基本顺序是,如果你将按钮的图像设置为某个东西,然后将其设置为nil,所有后续的setImage:调用都不会对按钮产生任何影响,就我所知。我忘记在原帖中提到这都是10.10.3。调试时我确实找到了一些有趣的东西。

看来,一旦你在NSButton上设置了一个图像,在运行循环的另一次传递之后,它会获得一个NSImageView作为子视图,这可能是在实际绘制图像。 Apple已经表示他们正在将NSCell推向弃用状态,所以我想这是第一步,减轻NSButtonCell实际绘制图像的责任。

因此,首次设置图片时,图片会在NSButtonNSImageView上正确设置。当图像设置回nil时,它们的图像也会恢复为nil。但是,当您第二次设置图像时,NSButton自己的image属性确实返回新图像时,基础NSImageView的{​​{1}}属性仍然存在零。所以这可以解释为什么它没有画任何东西。

最终我最终做的是使用一个普通的NSImageView,右上角有一个透明的image。当你点击按钮时,我没有得到突出显示,但我可以接受它。

相关问题