小牛问题:替换子视图时闪烁

时间:2014-01-06 22:40:57

标签: objective-c cocoa animation calayer osx-mavericks

在我的应用程序中,有一些区域我想要为视图设置动画。但是,我不想让视图层支持。所以,我创建了第二个视图(让我们称之为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版本之间存在差异......为什么会发生这种情况?

2 个答案:

答案 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
});