图层支持视图和闪烁控件

时间:2008-10-31 15:13:29

标签: objective-c cocoa core-animation

我有一个包含NSBox控件的窗口。在那个NSBox中有几个其他控件,(弹出窗口,文本字段等)

我在同一个NIB文件中有另外两个NSBox,这些NSBox充满了我想在某些条件下与第一个交换的控件。我希望这会发生一个很好的交叉淡入淡出效果,所以我做了以下几点:

在NSWindowController的-awakeFromNib方法中:

[[self.myWindow contentView] setWantsLayer:YES];

在我正在切换视图的方法中,我使用此代码:

[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];

这很好用,视图会像我期望的那样消失。问题是对视图的控制有时会消失,没有明显的原因。它并不总是相同的视图(虽然NSPopUpButtons看起来特别容易出现),并且它们通常在焦点时重新出现。

我是否还必须支持所有控制层?


更新:在显式分组中包装动画没有任何区别。在Nib文件中打开setWantsLayer也没有什么区别,但有趣的是,当我这样做时,NSPopupbuttons消失,直到点击其包含视图。在NSPopupbuttons上手动设置Layer也没有什么区别。

似乎其他人遇到了这个问题,但我找不到任何解决方案:

http://www.cocoabuilder.com/archive/message/cocoa/2008/3/30/202691 http://www.cocoabuilder.com/archive/message/cocoa/2008/4/25/205134

1 个答案:

答案 0 :(得分:4)

如果视图是图层备份的,则其所有子视图都将进行图层备份,因此您无需手动将它们设置为图层备份。我不知道是否有足够的信息可以看到这里发生了什么,但如果你在一个明确的分组中包装动画,我会感到好奇,如果你得到不同的行为:

[NSAnimationContext beginGrouping];
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];
[NSAnimationContext endGrouping];

另外,你是否有理由在awakeFromNib中调用setWantsLayer:而不是仅仅在nib中设置它(NSView检查器中应该有一个复选框)。