我正在使用基于视图的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:
方法。我在分配图像后尝试在按钮上调用-setNeedsDisplay:YES
,并设置layerContentRedrawPolicy
NSViewLayerContentsRedrawOnSetNeedsDisplay
(整个表视图是图层支持的),行为没有变化。编辑:也尝试完全禁用图层支持,没有任何更改。
我觉得必须有一些明显的东西让我盯着我失踪,但如果有人能让我知道,我会很感激。
答案 0 :(得分:0)
简短回答:这是一个错误!我已将其作为雷达20774731提交给Apple,并在http://openradar.appspot.com/radar?id=4957762287042560
打开Radar基本顺序是,如果你将按钮的图像设置为某个东西,然后将其设置为nil,所有后续的setImage:
调用都不会对按钮产生任何影响,就我所知。我忘记在原帖中提到这都是10.10.3。调试时我确实找到了一些有趣的东西。
看来,一旦你在NSButton
上设置了一个图像,在运行循环的另一次传递之后,它会获得一个NSImageView
作为子视图,这可能是在实际绘制图像。 Apple已经表示他们正在将NSCell
推向弃用状态,所以我想这是第一步,减轻NSButtonCell
实际绘制图像的责任。
因此,首次设置图片时,图片会在NSButton
和NSImageView
上正确设置。当图像设置回nil时,它们的图像也会恢复为nil。但是,当您第二次设置图像时,NSButton
自己的image
属性确实返回新图像时,基础NSImageView
的{{1}}属性仍然存在零。所以这可以解释为什么它没有画任何东西。
最终我最终做的是使用一个普通的NSImageView,右上角有一个透明的image
。当你点击按钮时,我没有得到突出显示,但我可以接受它。