繁体   English   中英

NSImageView在NSPopover中与NSTextField相交时的动画工件

[英]Animation artifacts when NSImageView intersects NSTextField in an NSPopover

我正在使用基于此示例代码的代码NSPopover呈现视图。

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

轻主题:
轻主题popover

黑暗主题:
黑暗主题popover

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

黑暗主题icky动画

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

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刚刚返回NOallowsVibrancy 行为没有变化。

接下来,我将NSViewNSView allowsVibrancyallowsVibrancy返回NOallowsVibrancy我的视图的父视图成为该实例。 行为没有变化。

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

错误的文字颜色

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

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

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

GitHub上的示例项目

编辑:所需的结果是图像和文本之间没有混合。 像这样的东西:

好的动画

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

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

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

我在代码中的话:

self.titleLabel.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
self.descriptionLabel.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];

幸运的是, NSVisualEffectView现在在El Capitan工作得很好。 所以你的代码应该在那里正常工作..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM