cocoa - El Capitan 破坏了我的 NSView 动画

标签 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 框架的设置实际上并未发生。

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

最佳答案

我遇到了非常类似的问题 - 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;

关于cocoa - El Capitan 破坏了我的 NSView 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706699/

相关文章:

objective-c - 应用程序内的 Cocoa 32 位和 64 位二进制文​​件

xcode - 在 Xcode 中更改对象颜色

ios - 子类化 CAShapeLayer 的正确方法

ios - CATransform3DMakeRotation 动画槽零(从 -45 到 +45 角)?

macos - 如何在NSView上绘制EPS数据

cocoa - 使用 CALayer 作为其他 NSView 的背景

NSView 相当于 UIView 剪辑 subview ?

objective-c - capitalizedString 不能正确大写以数字开头的单词?

ios - 在像 Adob​​e After Effects 这样的 iOS 项目中创建动画

cocoa - 现代 Cocoa 应用程序中的错误处理