4

我有一个 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一开始的 'frame 设置实际上并没有发生。

有人知道我做错了什么吗?

4

1 回答 1

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;
于 2016-03-11T18:32:51.897 回答