在我的应用程序中,有一些区域我想要为视图设置动画。但是,我不想让视图层支持。所以,我创建了第二个视图(让我们称之为animationView),它主持一个我然后设置动画的图层。当然,为了使animationView看起来像实际视图,我首先将视图渲染成图像,然后将其设置为animationView根层的内容。完成所有操作后,我用animationView替换视图。在这一点上,我可以使用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 [禁用|启用] ScreenUpdates后,我也遇到了这个问题。我也尝试在// Animate animationView
之后删除整个动画代码,这样就不会播放任何动画,我确保闪烁不是来自动画,而是实际来自替换视图的动作。仍然闪烁持续存在。我真的不明白为什么OS版本之间存在差异......为什么会发生这种情况?
答案 0 :(得分:1)
听起来小牛队有些疯狂。你试过了吗?
[self.window disableFlushWindow];
[self replaceSubview: view with: animationView];
[self.window enableFlushWindow];
另外,我注意到你在这里替换了子视图'view',但是你用'self'的内容替换'view'。什么是“观点”?
此外,您无需同时调用两者:
animationView.layer = [CALayer layer];
[animationView setWantsLayer: YES];
另外,请致电:
[CATransaction setDisableActions:YES];
答案 1 :(得分:-1)
请尝试替换主队列中的子视图(在本例中使用GCD和块)。这可以解决您的问题。
dispatch_sync(dispatch_get_main_queue(), ^{
// Your action here
});