1.UIViewAnimation简单易用,但可定制性太低,他的特点便是开弓没有回头箭,我们停不下来。当我们想暂停一个动画时,可以这样做:
speed
一个layer执行动画的速度,那么我们把layer的speed设置为0,动画自然就停止了。所以,speed这个参数是我们暂停动画的关键。
beginTime
动画开始的时间。
timeOffset
动画的偏移时间,有点类似scrollerView的contentOffset。
代码如下:
-(void)pauseLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
摘录来自: zangqilong. “iOS进阶指南”。 iBooks.
当暂停之后我们需要从暂停处重新启动:则需要拿到暂停时的时间偏移,然后赋值给动画的beginTime。
-(void)resumeLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
摘录来自: zangqilong. “iOS进阶指南”。 iBooks.
2.根据手势或者其他变量来控制动画:
添加动画时,如果我们想手动控制动画的执行,可以在动画添加之前将layer的speed设为0.
3.M34
这里有一个透视投影的概念:
在现实3D生活中,我们之所以能有强烈的立体感,是因为物体离我们的远近会影响他在我们眼中的视图大小,同样的东西在近处看绝对比远处看大,然而在屏幕上各个视图都是等距离的。
在等距投影中,远处的物体和近处的物体保持同样的缩放比例,这种投影也有它自己的用处(例如建筑绘图,颠倒,和伪3D视频),但当前我们并不需要。
为了做一些修正,我们需要引入投影变换(又称作z变换)来对除了旋转之外的变换矩阵做一些修改,Core Animation并没有给我们提供设置透视变换的函数,因此我们需要手动修改矩阵值,幸运的是,很简单:
CATransform3D
的透视效果通过一个矩阵中一个很简单的元素来控制:m34
。
“struct CATransform3D
{
CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(旋转), m32( ), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};”
摘录来自: zangqilong. “iOS进阶指南”。 iBooks.