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

400-111-8989

热门课程

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

  • 发布:余华
  • 来源:达内
  • 时间:2015-07-27 17:37

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

自从老师讲了手势,里面有图形的变换,我便对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)scaleUIButton *)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 setValueM_PI forKeyPath“transform.rotation.x”];
由于个人知识有限,都是些浅显的东西,大家就当是一个总结吧。

免费预约企业总监级讲师试听课

怕钱不够?就业挣钱后再付学费!     怕学不会?0基础入学,达内定制课程!     担心就业?近12万家雇主企业,推荐名企就业!

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

iOS系统上安装迅雷app教程

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

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

ios12版本新功能-隔墙有耳你会了吗?

选择城市和中心
贵州省

广西省

海南省