我正在为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];
我如何做一个推动画没有褪色?
无论视图是否支持CA,我发现获得平滑的核心动画过渡的最佳方法是做以下事情:
- 使用
NSView -cacheDisplayInRect:toBitmapImageRep
或类似的方法创建您正在尝试动画的视图的图像 - 将该图像放入NSImageView
- 图层后置图像视图,当图层后置时将画得很好,没有故障
- 将图像视图添加为视图的子视图
- 使用NSView的动画代理使图像视图帧动画化
- 动画完成后移除图像视图
我怀疑你遇到了隐式动画-核心动画将自动动画层属性的变化发生在你自己的事务之外。
在这两个问题中有几个很好的方法来禁用这些隐式动画:
如何禁用CALayer隐式动画?
禁用隐式动画-[CALayer setNeedsDisplayInRect:]
…你可以在Core Animation文档
我认为左过渡包含一个内置的渐变。IOS的推送转场可以。
如果你不想这样,你可能不得不使用Core Animation来滚动你自己的push transition。这在iOS的UIView动画中很容易做到。遗憾的是,在Mac OS中没有相应的功能。我希望苹果能回到过去,在Mac OS中添加视图动画。我在iOS中使用它们时被宠坏了,然后当我在Mac应用程序上工作时就会想念它们。
添加下面的代码
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[transition setDuration:0.5];
[self.view.layer addAnimation:transition forKey:kCATransition];