gpt4 book ai didi

macos - -[NSButton setImage :] only redraws the first time it's called

转载 作者:行者123 更新时间:2023-12-03 17:20:36 26 4
gpt4 key购买 nike

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

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

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

这是相关代码的摘要:

- (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,并设置NSViewLayerContentsRedrawOnSetNeedsDisplaylayerContentRedrawPolicy(整个 TableView 是分层支持的),行为没有变化。编辑:还尝试完全禁用图层支持,没有任何改变。

我觉得脸上一定有一些明显的东西在盯着我,而我却错过了,但如果有人能告诉我,我将不胜感激。

最佳答案

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

基本顺序是,如果您将按钮的图像设置为某些内容,然后将其设置回 nil,则所有后续 setImage: 调用都不会对该按钮产生任何影响,据我所知,永远不会有任何影响。我忘记在原来的帖子中提到这都是在 10.10.3 上发生的。不过,我在调试时确实发现了一些有趣的东西。

看来,一旦您在 NSButton 上设置了图像,在运行循环的额外传递之后,它就会获得 NSImageView 作为 subview ,这大概是在做图像的实际绘制。苹果表示他们正在将 NSCell 转向弃用,所以我想这是第一步,减轻 NSButtonCell 实际绘制图像的责任。

因此,第一次设置图像时,NSButtonNSImageView 上的图像都会正确设置。当图像被设置回零时,它们的图像也被设置回零。但是,当您第二次设置图像时,虽然 NSButton 自己的 image 属性确实返回新图像,但底层的 NSImageViewimage 属性仍然为零。所以这可以解释为什么它没有绘制任何东西。

最终我所做的是使用一个普通的 NSImageView ,其顶部有一个透明的 NSButton 。我没有看到点击按钮时的突出显示效果,但我可以接受。

关于macos - -[NSButton setImage :] only redraws the first time it's called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29977523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com