【发布时间】:2014-01-06 22:40:56
【问题描述】:
在我的应用中,有一些区域我想为视图设置动画。但是,我不想让视图 layer-backed 。因此,我创建了第二个视图(我们称之为动画视图),它承载了一个层,然后我对其进行动画处理。当然,为了让动画视图看起来像实际视图,我首先将视图渲染为图像,然后将其设置为动画视图根层的内容。完成所有这些后,我将视图替换为动画视图。在这一点上,我可以使用 CALayer 动画的所有功能,而无需支持实际的视图层。这是我一直在描述的代码(我会在一分钟内解决我的问题):
// Creating an animationView
NSView* animationView = [[NSView alloc] initWithFrame: self.bounds];
animationView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
animationView.layer = [CALayer layer];
[animationView setWantsLayer: YES];
// Snapshotting the actual view
NSBitmapImageRep* imageRep = [view bitmapImageRepForCachingDisplayInRect: view.bounds];
[view cacheDisplayInRect: view.bounds toBitmapImageRep: imageRep];
NSImage* image = [[NSImage alloc] initWithSize: [imageRep size]];
[image addRepresentation: imageRep];
// Replacing the view with animationView
NSDisableScreenUpdates();
[CATransaction begin];
[CATransaction setDisableActions:YES];
layer.contents = image;
[CATransaction commit];
[self replaceSubview: view with: animationView];
NSEnableScreenUpdates();
// Animate animationView
// ...
这在 10.8 上完美运行,并且在 10.9 上的动画也播放得很好,但是在 10.9 上,替换视图时只有可见的闪烁。即使在使用 NS[Disable|Enable]ScreenUpdates 之后,我也遇到了这个问题。我还尝试在// Animate animationView 之后删除整个动画代码,这样就不会播放动画,并且我确保闪烁不是来自动画,而是实际上来自替换视图的动作。闪烁仍然存在。我真的不明白为什么操作系统版本之间存在差异......为什么会发生这种情况?
【问题讨论】:
标签: objective-c cocoa animation calayer osx-mavericks