4

アニメーションのグループ化を使用して、1 つのオフスクリーンと別のオンスクリーンNSAnimationContextをアニメーション化する Mac アプリがあります。アニメーションのグループ化を開始する前に、画面上でアニメーション化するときに開始したい位置 にオフスクリーンを配置します。NSViewNSViewNSView

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最初のフレームの設定が実際には発生していないようです。

私が間違っていることを誰かが知っていますか?

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 に答える