一个 viewtransform 属性改变这个 view 是如何被绘制的,实际上就是一个 CGAffineTransform类的 3x3 矩阵(线性代数中的概念)。所有的变换都是以这个 viewcenter 做基准的。

根据仿射变化的定义,因为背后实际上是矩阵乘法,所以不同的变换是可以叠加的,并且顺序是重要的(矩阵乘法不满足交换律)

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 ]. */

评测矩阵

  1. 判断两个Transform 是否相等

/* Return true if `t1' and `t2' are equal, false otherwise. */

@available(iOS 2.0, *)
public func CGAffineTransformEqualToTransform(t1: CGAffineTransform, _ t2: CGAffineTransform) -> Bool
  1. 是否是CGAffineTransformIsIdentity

/* Return true if `t' is the identity transform, false otherwise. */

@available(iOS 2.0, *)
public func CGAffineTransformIsIdentity(t: CGAffineTransform) -> Bool

平移

  1. 根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)

  2. 根据本身的 transform 另外的transform进行平移CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)

缩放

  1. 根据本身的transform进行缩放 CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)

  2. 根据本身的transform后者另外的transform进行缩放CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)

旋转

  1. 根据本身的transform进行旋转 CGAffineTransformMakeRotation(CGFloat angle) (angle 旋转的角度)

  2. 根据本身的transform后者另外的transform进行旋转 CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

反向旋转

CGAffineTransformInvert(CGAffineTransform t)

合并

func CGAffineTransformConcat(_ t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform

应用仿射矩阵

  1. CGPointApplyAffineTransform 得到新的点

  2. CGSizeApplyAffineTransform 得到新的size

  3. CGRectApplyAffineTransform 得到新的rect

应用

放射矩阵一个常用的情形就是根据用户的手势来相应的改变视图的变换

UIPanGestureRecognizer 对应位移

UIPinchGestureRecognizer 对应缩放

UIRotationGestureRecognizer 对应旋转

通常如果需要看到实时的手指移动视图就相应的变换的技巧就是,每次接收到对应的gesture时间就相应的改变view的transform,然后吧这个gesture对应的translationscalerotation置为初始值。

参考:

Apple Developer Reference

iOS 仿射变换CGAffineTransform详解

CGAffineTransform 详解


dowhilenet
654 声望10 粉丝

引用和评论

0 条评论