视图的transform
属性改变了视图绘制的方式,例如,它可能会改变视图的可视尺寸和方向(注意:是可视的,即人眼看到的),但是并不影响视图的bounds
和center
。一个变换过的(transformed)视图依然会保持正确的表现:例如,一个旋转过的按钮依然可以在可视区域内点击。
transform的类型是CGAffineTransform
,它是一个结构体。系统提供了方法来创建三种基本类型的变换:旋转(rotation)、缩放(scaling)、位移(translation),方法名都以CGAffineTransformMake...
开头,第四种基本的变化类型,倾斜(skewing),没有现有的方法来实现。
默认地,一个视图的变换矩阵是CGAffineTransformIdentity
,它并没有什么效果。
let v=UIView(frame:CGRectMake(100,100,100,44))
v.backgroundColor=UIColor.redColor()
v.transform=CGAffineTransformMakeRotation(45*CGFloat(M_PI)/180.0) //旋转45度,旋转的参数是以弧度制
系统提供的变换方法如下:
CGAffineTransformMakeTranslation
:位移CGAffineTransformMakeScale
:缩放CGAffineTransformMakeRotation
:旋转
一个视图进行变换后,它的frame
会发生改变,但它的bounds
和center
保持不变。
变化矩阵可以以链式(即对视图进行连续变换)来进行。系统提供方法来将一个变换应用到另一个变换上,这些方法名不包含Make
.例如:
v2.transform=CGAffineTransformMakeTranslation(100, 100) v2.transform=CGAffineTransformTranslate(v2.transform, -100, -100)
注意上面代码与下面代码的区别:
v2.transform=CGAffineTransformMakeTranslation(100, 100)
v2.transform=CGAffineTransformMakeTranslation(-100, -100)
尽管两段代码都进行了两次变换,但是效果完全不同:第一段代码是连续变换的,就是说,第二次变换是在第一次变换的基础上进行的;而第二段代码的两次变换始终是以视图的初始状态为基础的。
系统提供了CGAffineTransformConcat
函数来进行两次连续的变换,代码如下:
let t1=CGAffineTransformMakeTranslation(100, 100)
let t2=CGAffineTransformMakeTranslation(-100, -100)
v2.transform=CGAffineTransformConcat(t1, t2)
为了移除从变换组合中移除一个变换,使用函数CGAffineTransformInvert
,代码如下:
v2.transform=CGAffineTransformConcat(t1, t2) v2.transform=CGAffineTransformConcat(CGAffineTransformInvert(t2),v2.transform)
最后,为了创建一个倾斜的变化,我们将手动创建一个:
v2.transform=CGAffineTransformMake(1, 0, -0.2, 1, 0, 0)