- 1、本文档共54页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS 核心动画的变换
iOS 核⼼动画的变换
很不幸,没人能告诉你母体是什么,你只能自己体会 -- 骇客帝国
在第四章“可视效果” ,我们研究了一些增强图层和它的内容显示效果的一些技术,
在这一章 ,我们将要研究可以用来对图层旋转,摆放或者扭曲的
CGAffineTransform,以及可以将扁平物体转换成三维空间对象的
CATransform3D (而不是仅仅对圆角矩形添加下沉阴影)。
仿射变换
在第三章“图层几何学” ,我们使用了UIView的transform属性旋转了钟的指针,但
并没有解释背后运作的原理,实际上UIView的transform属性是一
个CGAffineTransform类型,用于在二维空间做旋转,缩放和平
移。CGAffineTransform是一个可以和二维空间向量 (例如CGPoint )做乘法的3X2
的矩阵 (见图5.1)。
图5.1 用矩阵表示的CGAffineTransform和CGPoint
用CGPoint的每一列和CGAffineTransform矩阵的每一行对应元素相乘再求和,就
形成了一个新的CGPoint类型的结果。要解释一下图 显示的灰色元素,为了能让矩
阵做乘法,左边矩阵的列数一定要和右边矩阵的行数个数相同,所以要给矩阵填充一
些标志值,使得既可以让矩阵做乘法,又不改变运算结果,并且没必要存储这些添加
的值,因为它们的值不会发生变化,但是要用来做运算。
因此,通常会用3×3 (而不是2×3)的矩阵来做二维变换,你可能会见到3行2列格
式的矩阵,这是所谓的以列为主的格式,图5.1所示的是以行为主的格式,只要能保
持一致,用哪种格式都无所谓。
当对图层应用变换矩阵,图层矩形内的每一个点都被相应地做变换,从而形成一个新
的四边形的形状。CGAffineTransform 的“仿射”的意思是无论变换矩阵用什么
值,图层 平行的两条线在变换之后任然保持平行,CGAffineTransform可以做出
任意符合上述标注的变换,图5.2显示了一些仿射的和非仿射的变换:
图5.2 仿射和非仿射变换
创建一个CGAffineTransform
对矩阵数学做一个全面的阐述就超出本书的讨论范围了,不过如果你对矩阵完全不熟
悉的话,矩阵变换可能会使你感到畏惧。幸运的是,Core Graphics提供了一系列函
数,对完全没有数学基础的开发者也能够简单地做一些变换。如下几个函数都创建了
一个CGAffineTransform实例:
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
旋转和缩放变换都可以很好解释--分别旋转或者缩放一个向量的值。平移变换是指每
个点都移动了向量指定的x或者y值--所以如果向量代表了一个点,那它就平移了这个
点的距离。
我们用一个很简单的项目来做个demo,把一个原始视图旋转45度角度 (图5.3)
图5.3 使用仿射变换旋转45度角之后的视图
UIView可以通过设置transform属性做变换,但实际上它只是封装了内部图层的变
换。
CALayer同样也有一个transform属性,但它的类型是CATransform3D,而不
是CGAffineTransform,本章后续将会详细解释。CALayer对应于UIView的
transform属性叫做affineTransform,清单5.1的例子就是使
用affineTransform对图层做了45度顺时针旋转。
清单5.1 使用affineTransform对图层旋转45度
@interface ViewController ()
@ ro erty (nonatomic, weak) IBOutlet UIView *layerView;
@end
@im lementation ViewController
- (void)viewDidLoad
{
[su er viewDidLoad];
//rotate the layer 45 degrees
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4)
self .layerView.layer.affineTransform = transform;
文档评论(0)