一个 view
的 transform
属性改变这个 view
是如何被绘制的,实际上就是一个 CGAffineTransform
类的 3x3 矩阵(线性代数中的概念)。所有的变换都是以这个 view
的 center
做基准的。
根据仿射变化的定义,因为背后实际上是矩阵乘法,所以不同的变换是可以叠加的,并且顺序是重要的(矩阵乘法不满足交换律)
CGAffineTransform 定义
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)
}
我们在初始化的时候
a
表示水方向的缩放 tx
表示水平方向的偏移d
表示垂直方向的缩放, ty
表示垂直方向的偏移
如果 b
c
不为 0 的话,那么坑定发生了旋转。
public let CGAffineTransformIdentity: CGAffineTransform
/* The identity transform: [ 1 0 0 1 0 0 ]. */
评测矩阵
判断两个Transform 是否相等
/* Return true if `t1' and `t2' are equal, false otherwise. */
@available(iOS 2.0, *)
public func CGAffineTransformEqualToTransform(t1: CGAffineTransform, _ t2: CGAffineTransform) -> Bool
是否是CGAffineTransformIsIdentity
/* Return true if `t' is the identity transform, false otherwise. */
@available(iOS 2.0, *)
public func CGAffineTransformIsIdentity(t: CGAffineTransform) -> Bool
平移
根据本身的transform进行平移
CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
根据本身的 transform 另外的transform进行平移
CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
缩放
根据本身的transform进行缩放
CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
根据本身的transform后者另外的transform进行缩放
CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
旋转
根据本身的transform进行旋转
CGAffineTransformMakeRotation(CGFloat angle)
(angle 旋转的角度)根据本身的transform后者另外的transform进行旋转
CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
反向旋转
CGAffineTransformInvert(CGAffineTransform t)
合并
func CGAffineTransformConcat(_ t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform
应用仿射矩阵
CGPointApplyAffineTransform 得到新的点
CGSizeApplyAffineTransform 得到新的size
CGRectApplyAffineTransform 得到新的rect
应用
放射矩阵一个常用的情形就是根据用户的手势来相应的改变视图的变换
UIPanGestureRecognizer
对应位移
UIPinchGestureRecognizer
对应缩放
UIRotationGestureRecognizer
对应旋转
通常如果需要看到实时的手指移动视图就相应的变换的技巧就是,每次接收到对应的gesture
时间就相应的改变view的transform
,然后吧这个gesture
对应的translation
、scale
、rotation
置为初始值。
参考:
Apple Developer Reference
iOS 仿射变换CGAffineTransform详解
CGAffineTransform 详解