Mac App动画外卖

我正在开发需要完成一些动画的Mac App。 实际上,我对Mac App上的动画主题还很陌生。 例如,我的动画代码可以在iOS中使用,但是我想移植到Mac App。 这是动画的一些要点,动画沿x轴旋转图层。

应用3D变换

只是从iOS复制代码,我遇到的第一个问题是初始转换无法正常工作。 我想将初始状态设置为旋转45度,但是该层保持在朝前的位置。

最后,我意识到在Cocoa中,必须在应用转换之前将视图添加到视图层次结构中。 如果不添加为子视图,则不会渲染相应的视图。 因此,应用变换对其没有影响。

转换所有子视图

在寻找上一个问题的解决方案时,我认为这可能是默认情况下不支持CALayer的问题。 我什至以为可能无法将转换应用于相应视图的根层。

我最终知道,如果我为转换创建了另一个CALayer,并将该层插入到层层次结构中。 仅此层将被转换,所有子视图(如NSTextField)将保持不变。 另一个发现是,可以在将根视图添加到视图层次结构之前转换此层。

比较iOS动画API

在iOS中,可以使用“ UIView.animateWithDuration()” API进行动画处理。 该方法允许我设置持续时间,延迟,阻尼系数以及完成块。 但是,这个漂亮的API或类似的东西在Cocoa中不可用。

我最终使用“ CABasicAnimation”为旋转动画,然后使用“ CATransaction”应用完成块。 我可以选择使用委托方法来在动画完成时引起注意,但是我认为完成块使代码更清晰。

动画转换

如前所述,我使用CABasicAnimation对旋转进行动画处理。 它正在使用keyPath。 由于我要使图层沿x轴旋转,因此必须使用“ transform.rotation.x”。 该API非常简单,但是不够迅速。 keyPath的使用不是类型安全的。

自Swift 3起,此类API将会有巨大的改进。 Swift 3的API已变得稳定。 这将在Xcode 8公开发布中正式提供。

这是此职位的示例操场。

参考文献:

如何将适用于UIView的视图转换应用于NSView?

将NSImageView的CALayer旋转90度

CATransform3DRotate旋转360度

CATransform3D关键路径

XCPlayground基础🎪