Transform(变换)

视图的transform属性改变了视图绘制的方式,例如,它可能会改变视图的可视尺寸和方向(注意:是可视的,即人眼看到的),但是并不影响视图的boundscenter。一个变换过的(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会发生改变,但它的boundscenter保持不变。

变化矩阵可以以链式(即对视图进行连续变换)来进行。系统提供方法来将一个变换应用到另一个变换上,这些方法名不包含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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值