9

我正在为 Mac OS X 制作一个导航控制器类。

我想用kCATransitionPush动画替换当前视图。
就像在这篇文章中一样:
核心动画教程 - 带有过渡的向导对话框

CATransition是这样设置的:

CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[self.view setAnimations:@{ @"subviews" : transition }];

但是,当我替换视图时,会自动添加一个淡入淡出动画。

[NSAnimationContext beginGrouping];
{
    [[self.view animator] replaceSubview:_currentViewController.view with:newViewController.view];
}
[NSAnimationContext endGrouping];

如何在没有褪色的情况下制作推送动画?

4

4 回答 4

6

无论视图是否支持 CA,我发现获得平滑的核心动画过渡的最佳方法是执行以下操作:

  1. NSView -cacheDisplayInRect:toBitmapImageRep使用或类似方法创建您尝试设置动画的视图的图像
  2. 将该图像放入 NSImageView
  3. 将图像视图分层,当分层支持时,它将绘制得很好而不会出现故障
  4. 将图像视图添加为您尝试转换的视图的子视图
  5. 使用 NSView 的动画代理为图像视图帧设置动画
  6. 动画完成后移除图像视图
于 2013-03-19T18:22:09.043 回答
1

我怀疑您遇到了隐式动画 - Core Animation 将自动为您自己的事务之外发生的图层属性更改设置动画。

在这两个问题中,对禁用这些隐式动画的几种方法进行了很好的总结:

如何禁用 CALayer 隐式动画?

在 -[CALayer setNeedsDisplayInRect:] 中禁用隐式动画

...您可以在 Core Animation 文档中阅读有关隐式事务的更多信息

于 2013-01-12T13:37:25.603 回答
1

我认为从左过渡的过渡包括内置的淡入淡出。IOS 推送转换可以。

如果您不希望这样,您可能必须使用 Core Animation 滚动您自己的推送过渡。这在带有 UIView 动画的 iOS 中很容易。可悲的是,Mac OS 中没有等价物。我希望 Apple 能够返回并在 Mac OS 中添加视图动画。我在 iOS 中使用它们时会被宠坏,然后在我使用 Mac 应用程序时会想念它们。

于 2013-01-13T01:24:17.367 回答
0

添加以下代码

        CATransition *transition = [CATransition animation];
        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFromLeft;
        [transition setDuration:0.5];
        [self.view.layer addAnimation:transition forKey:kCATransition];
于 2019-08-06T10:46:36.237 回答