El Capitan打破了我的NSView动画

时间:2015-09-22 00:50:15

标签: cocoa core-animation nsview osx-elcapitan nsanimationcontext

我有一个Mac应用程序,它使用NSAnimationContext动画分组来动画一个NSView离屏幕和另一个NSView屏幕动画。在开始动画分组之前,我将屏幕外NSView置于我希望它在屏幕上动画时产生的位置。

在Yosemite和早期版本下,这种方法运行得很好但是在El Capitan下,好像NSView永远不会定位在我指定的起始位置,因此它会从错误的方向激活屏幕。

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

//Create animation grouping
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:animationDuration];
[[NSAnimationContext currentContext] setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[NSAnimationContext currentContext] setCompletionHandler:^{
    /*
    Do cleanup stuff here
    */
}];

//Move the views
onscreenView.frame = ENDING_OFFSCREEN_RECT:
offscreenView.frame = ENDING_ONSCREEN_RECT;

//End Grouping
[NSAnimationContext endGrouping];

我已尽最大努力调试了这一点,在我看来,offscreenView框架在开始时的设置实际上并未发生。

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题 - offscreenView 有时从错误的位置开始 offscreenView.layer似乎搞砸了。

我通过在清理代码中添加以下内容来修复它:

onscreenView.layer = nil;

以便下次offscreenView动画时,它将以干净的图层开始 或者在您开始动画之前重置图层:

offscreenView.layer = nil;

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

//Create animation grouping
...

注:

在我的动画中,我每次都将offscreenView添加到superView:

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

[superView addSubview:offscreenView];

//Create animation grouping
...

在清理代码中,我也删除了onscreenView

[onscreenView removeFromSuperview];
onscreenView.layer = nil;