您的位置:首页 > 其它

Transform(变换)

2015-11-12 16:17 183 查看
视图的
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: