【问题标题】:El Capitan broke my NSView animationsEl Capitan 破坏了我的 NSView 动画
【发布时间】:2015-09-22 00:50:14
【问题描述】:

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

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

【问题讨论】:

  • 我遇到了同样的情况,但是在动画 NSLayoutConstraint 的常量时。我的临时解决方法是为 alpha 而不是框架设置动画,这样视图就不会突然出现,但我对此并不满意。

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


【解决方案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-08-23
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2015-12-23
    • 2015-05-10
    • 2016-03-15
    相关资源
    最近更新 更多