动画程序员iOS Developer

UIView Animation(二)-Transform(Sw

2016-08-10  本文已影响1567人  ZhHS

本文及其之后的讲解是依据Raywenderich 的 Animation Tutorial这一本书和苹果官方文档总结而来,特此声明!

API解读

A structure for holding an affine transformation matrix
一个用于映射转换矩阵的结构体

//transform 是一种状态,并且只有一种状态,做动画需要结合UIAnimation API使用
public struct CGAffineTransform {
    public var a: CGFloat
    public var b: CGFloat
    public var c: CGFloat
    public var d: CGFloat
    public var tx: CGFloat
    public var ty: CGFloat
    public init()
    public init(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat)
}

对应矩阵:


刚开始看着头疼,始终不理解,查了许多资料,看了苹果官方文档,终于明白了!(PS:数学真的很重要,这里牵扯到向量和矩阵,如果不太清楚,请百度)
简单点来说,view是由多个像素块构成的,而transform的作用是通过修改属性值来更改像素点的(x,y),最终达到缩放,旋转和平移的目的!注意:CGAffineTransform只能在二维坐标中操作,如果做3D操作,需要通过核心动画完成(暂时不说核心动画),像素点(x,y)本质是一个二维坐标中的向量,如下图:


Apple提供了一个公式来计算像素点的(x,y),计算时[x,y,1]代表原来的像素块,假设(x’,y’)为更改之后新的像素块,计算公式如下:

两个矩阵相乘:

示意图:

CGAffineTransform默认值为CGAffineTransformIdentity,是一个常量(1,0,0,1,0,0),对应矩阵如下:





//多次操作时调用
CGAffineTransformScale(t: CGAffineTransform, sx: CGFloat, sy: CGFloat) -> CGAffineTransform
CGAffineTransformRotate(t: CGAffineTransform, angle: CGFloat) -> CGAffineTransform
CGAffineTransformTranslate(t: CGAffineTransform, tx: CGFloat, ty: CGFloat) -> CGAffineTransform

//将两个操作结合,返回一个CGAffineTransform对象 
 CGAffineTransformConcat(t1: CGAffineTransform, t2: CGAffineTransform) -> CGAffineTransform
//对传入CGAffine对象反向操作
CGAffineTransformInvert(t: CGAffineTransform) -> CGAffineTransform
//判断两个操作是否相同
CGAffineTransformEqualToTransform(t1: CGAffineTransform, _ t2: CGAffineTransform) -> Bool

这些API结合使用,已经可以实现很炫的动效,建议动手试试

Demo

这个Demo,基本用到了前两章所讲到的API,仅供参考

上一篇 下一篇

猜你喜欢

热点阅读