IOS培训
美国上市IOS培训机构

400-111-8989

热门课程

达内学员余华:iOS几何变换总结

  • 发布:余华
  • 来源:达内
  • 时间:2018-09-11 13:17

达内成都高升桥中心-学员-余华

自从老师讲了手势,里面有图形的变换,我便对iOS中的图形编程产生了兴趣。经过一段时间课外的学习,我现在把学到的一些关于几何变换的知识拿出来,谈谈我的理解。当然,图形编程远不止几何变换这么简单。

iOS的几何变换,包括了2D变换,3D变换。

首先,我们来看看2D变换。transform我们称为形变属性,也就是控制2D变换的一个属性。该属性通过矩阵变化,可以改变控件的大小、角度、位置等。我们可以通过苹果给我们封装好的三个方法来实现上述变换,分别是:CGAffineTransformMakeRotation(旋转)、CGAffineTransformMakeScale(缩放)、CGAffineTransformMakeTranslation(移动),这三个方法的形变是基于最初没有形变的基础上进行形变的,而如果需要对传入的transform基础上进行形变,则要采用没有make的对应方法。由于2D变换老师上课的时候已经很详细的讲过了,我这里也就不过多的解释了,大家不了解的可以去看看笔记。

接下来是3D变换。3D变换我们通过改变结构体CATransform3D来实现图层的旋转、缩放、偏移、歪斜和透视等等。

要改变CATransform3D,可以使用以下3个方法:

1、使用CATransform3D函数。

CATransform3DMakeTranslation

CATransform3DTranslate

CATransform3DMakeScale

CATransform3DScale

CATransform3DMakeRotation

CATransform3DRotate

我们直接看代码,其实和2D变换的区别不是很大,只是多了一个z轴,相信空间想象能力好的同学能够想象出来。

- (IBAction)scale
UIButton *)sender {

//创建,并返回一个基本的动画实例,指定了关键的路径

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath
"transform"];

//设置缩放比例,z轴的缩放无法明显的显示出来,所以设置为1

CATransform3D transform = CATransform3DMakeScale(0.1, 0.1, 1.0);

//由于settovalue需要的是一个对象,需要把transform转换成对象

NSValue *value = [NSValue valueWithCATransform3D:transform];

[animation setToValue:value];

//动画是否按照原路返回

[animation setAutoreverses:YES];

//动画执行的时间

[animation setDuration:2.0];

//动画执行的次数

[animation setRepeatCount:2];

//添加动画到imageview

[self.imageView.layer addAnimation:animation forKey:nil];

}

//旋转和移动的具体内容请看附件的代码,和上面的一样

CATransform3D transform = CATransform3DMakeRotation(M_PI, 1, 0, 0);旋转

CATransform3D transform = CATransform3DMakeTranslation(100, 100, 0);移动

2、直接修改数据结构的成员。

struct CATransform3D

{

CGFloat m11(x缩放), m12(y切变), m13, m14;

CGFloat m21(x切变), m22(y缩放), m23, m24;

CGFloat m31, m32, m33, m34(透视效果,必须要有值才有效果);

CGFloat m41(x平移), m42(y平移), m43(z平移), m44;

};

上面是CATransform3D结构体的组成。其中,主要的是m34,可以实现view的透视效果。m34=-1/D。其中,D的值越大,透视效果越不明显。如果m34设置为0,那么,无论怎么旋转,一定不会出现透视效果。

关于修改结构体的成员,是一个很复杂的数学计算,内容太多,还是简单谈谈怎么实现透视。

- (void)viewDidLoad

{

[super viewDidLoad];

CATransform3D transform = CATransform3DIdentity;

//必须要设置,不设置无法显示透视效果

transform.m34 = 0.001;

//绕x轴旋转-M_PI_4度。

transform = CATransform3DRotate(transform, -M_PI_4, 0, 1, 0);

[self.imageView.layer setTransform:transform];

}

3、使用建-值编码改变键路径

rotation.x x轴旋转的弧度

rotation.y y轴旋转的弧度

rotation.z z轴旋转的弧度

scale.x x轴缩放比例

scale.y y轴缩放比例

scale.z z轴缩放比例

translation.x x轴移动

translation.y y轴移动

translation.z z轴移动

在OC中,不可以直接设置CATransform3D结构体的值,比如:myLayer.transform.rotation.x = 0是不能运行的。需要使用

[myLayer setValue:[NSNumber bumberWithInt:0] forKeyPath
“transform.rotation.x”];的方式赋值。

比如下面这句:layer.transform = CATransform3DMakeRotation(M_PI,1,0,0);

和这句话是等效的:[layer setValue
M_PI forKeyPath
“transform.rotation.x”];

由于个人知识有限,都是些浅显的东西,大家就当是一个总结吧。

预约申请免费试听课

上一篇:达内iOS培训:面试成功的4大技巧
下一篇:分享一个自己写的从键盘录入int型整数的小函数

iOS12降级到11.4.1正式版教程

iOS系统上安装迅雷app教程

越狱教程来了,iOS11.3.1越狱教程

升级必看iOS 12 公测版 升降级指南

选择城市和中心
贵州省

广西省

海南省