NSImageView在NSPopover

时间:2015-08-06 05:57:44

标签: objective-c macos cocoa core-animation nspopover

我使用基于this sample code的代码在NSPopover中展示了一个视图。

视图及其所有子视图都是图层支持的。有一个NSImageView和几个不可编辑的NSTextField。文本字段backgroundColor设置为[NSColor textBackgroundColor]textColor设置为[NSColor textColor]。这样,如果使用普通主题,文本是黑色的,如果使用“黑暗菜单栏和Dock”选项(从现在开始我将其称为“黑暗主题”),则文本为白色。这一切都很好,它看起来有点像这样:

轻主题:
light theme popover

黑暗主题:
dark theme popover

当我在视图上设置NSImageView动画时出现问题。当它与NSTextField s相交时,图像似乎以不吸引人的方式与文本字段混合。它既出现在明暗主题中,也出现在黑暗主题中,但在黑暗主题中看起来更为狡猾(这是一个技术术语)。挖掘它:

dark theme icky animation

为它制作动画的代码看起来基本上是这样的:

CABasicAnimation* positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
positionAnimation.fromValue = [NSValue valueWithPoint:fromPoint];
positionAnimation.toValue = [NSValue valueWithPoint:toPoint];
positionAnimation.duration = imageAnimationDuration;
[self.imageView.layer addAnimation:positionAnimation forKey:@"position"];
self.imageView.layer.position = toPoint;

我尝试了什么?哦,我没有尝试过什么?

首先,我自己的观点没有任何类型的NSVisualEffectView。但似乎NSPopover自己增加了它;你可以清楚地看到我的桌面在上面的动画中通过popover流血。没关系;这实际上是一个很好的效果。但是,考虑到我的NSImageView试图充满活力,我将NSImageView子类化为仅从NO返回allowsVibrancy。行为没有变化。

接下来,我将NSView子类化为从NO返回allowsVibrancy,并使我的视图的父视图成为其中的一个实例。行为没有变化。

我的NSTextField设置为drawsBackground = NO,因此我将其更改为YES。行为没有变化。然后,离开drawsBackground = YES,我将两个文本字段的backgroundColor设置为[NSColor clearColor]。这就是它变得奇怪的地方。 确实会使奇怪的绘图消失,会将其中一个文本字段(较小的一个)的文本颜色更改为黑色。武汉理工大学?见下文。

wrong text color

我放弃了背景颜色,开始搞乱文字颜色。我发现,如果我将文本字段的textColor设置为离散颜色(例如,[NSColor blackColor][NSColor whiteColor],那么奇怪的绘图问题也会消失。似乎只会变得奇怪当使用适合主题的颜色,例如[NSColor textColor]。这是超级跛脚,因为使用[NSColor textColor]之类的东西的全部意义在于它适应主题。我可以可能会破解并弄清楚什么主题是活动的并手动设置颜色,但如果我能帮助它,我真的不想走那条路。

我保证这里有一个问题,而且,仁慈地,这里是:

如何修复上面显示的动画问题,同时仍然使用能够正确适应当前主题的颜色?

Sample project on GitHub

修改 期望的结果是在图像和文本之间没有混合。像这样:

good-animation

我在示例应用程序中使用的图像可能不是传达我在实际应用程序中看到的动画的纯粹yuckiness的最佳示例。样本中的图像大部分是白色的,而在我的实际应用程序中,它主要是黑色的,当与白色文本混合时,它看起来真的很糟糕。

1 个答案:

答案 0 :(得分:1)

视觉效果视图(就像在NSPopover中使用的)在OS X Yosemite中完全搞砸了,它们在这里引起了你的问题。这不是你的错,这些观点完全是错误的。

Yosemite的解决方法应该是将每个appearance的{​​{1}}属性设置为NSTextField。因为如果标签不试图做一些奇怪的活力效果,他们就不会搞砸了。标签看起来仍然一样,奇怪的效果消失了。

我在代码中的说法:

NSAppearanceNameAqua

幸运的是self.titleLabel.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua]; self.descriptionLabel.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua]; 现在在El Capitan工作正常。所以你的代码应该可以正常工作..