view.transform属性实战

transform:形变属性。能完成的功能:平移、缩放、旋转。本质上这些属性就是操纵UIView的frame。一般配合animateWithDuration做动画效果。

1.初始化方法

self.view.transform = CGAffineTransformMake(1, 1, 1, 1, 10, 10);
  • CGAffineTransform是一个结构体,类似我们常见的CGRect、size,创建是利用CG....Make(),CGAffineTransform同样也是如此。

  • CGAffineTransformMake(a,b,c,d,tx,ty) ad缩放bc旋转tx,ty位移,基础的2D矩阵 公式 x=ax+cy+tx y=bx+dy+ty 1.矩阵的基本知识:structCGAffineTransform{ CGFloata,b,c,d; CGFloattx,ty;};CGAffineTransformCGAffineTransformMake

  • CGAffineTransformMake()深入理解请点击

2、基本使用

transform的使用其实就是将一个控件的位置、大小、角度进行改变

①平移Translation
   //这句话代表:tempView 水平方向平移100,垂直方向平移50.
   self.tempView.transform = CGAffineTransformMakeTranslation(100, 50);
②缩放Scale
   //宽度缩放0.5倍,高度缩放0.3倍
    self.tempView.transform = CGAffineTransformMakeScale(0.5, 0.3);
  • 缩放是绕着中心点进行缩放
③旋转Rotation
   //顺时针旋转180度
    self.tempView.transform = CGAffineTransformMakeRotation(M_PI_2);
  • 选转是旋转多少角度。iOS中 180°M_PI,90°M_PI_2,45°M_PI_4
  • 正数是顺时针旋转,负数是逆时针方向旋转

3.多种形变嵌套使用

形变的嵌套使用其实就是同时对View进行缩放、平移、旋转。例如边旋转边平移

①错误写法

    //错误示范
    [UIView animateWithDuration:2.f animations:^{
        self.tempView.transform = CGAffineTransformMakeTranslation(100, 50);
        self.tempView.transform = CGAffineTransformMakeRotation(M_PI_2);
        self.tempView.transform = CGAffineTransformMakeScale(0.5, 0.3);
    }];
  • 这样达不到同时对View缩放、平移、旋转的效果
    原因:view. transform归根结底也是个属性,对属性依次进行赋值,你对frame赋值三次,系统最后选择的是你最后依次赋值的一个值。所以上边错误示范里边只会执行宽度缩放0.5倍,高度缩放0.3倍的效果
②正确使用: 对transform对象进行形变操作
    //正确思路
    [UIView animateWithDuration:2.f animations:^{
        //1.首先创建一个CGAffineTransform平移对象
        CGAffineTransform  translation = CGAffineTransformMakeTranslation(100, 50);
        //2.将平移对象嵌套到缩放形变中
        CGAffineTransform  scale = CGAffineTransformScale(translation, 0.5, 0.3);
        
        //3.将上边的形变再嵌套
        self.tempView.transform = CGAffineTransformRotate(scale, M_PI_2);
    }];
  • 嵌套顺序是随意的,不要拘泥于示例代码。读者可以自己试一试

4.形变叠加

形变叠加就是如果在上一次的形变基础上再叠加一个同样的效果。 比如说我要做出这样一种效果点击一下屏幕,tempView选转45度,再点击再旋转45度,以此类推。

①错误写法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [UIView animateWithDuration:1.0 animations:^{
       
        self.tempView.transform = CGAffineTransformMakeRotation(M_PI_4);
    }];
}
  • 这样书写的效果仅仅就是第一次点击旋转了45度,第二次及之后的点击都没有效果。
    原因:CGAffineTransformMake....做出的三种形变都是相对于控件没有做任何形变最初的状态做的形变。
②正确写法
第一种:对形变传入的参数每次累加
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [UIView animateWithDuration:1.0 animations:^{
        
        static double angle = 0;
        angle += M_PI_4;
        self.tempView.transform = CGAffineTransformMakeRotation(angle);
    }];
}
  • angle你可以定义为全局变量,每次累加变量即可
  • 当static关键字修饰局部变量时,该局部变量只会初始化一次,在系统中只有一份内存 。static关键字不可以改变局部变量的作用域,但是可延长局部变量的生命周期,该变量直到整个项目结束的时候才会被销毁。(笔者这样写只是为了和下边第二种正确写法做比较)
第二种:利用形变嵌套
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [UIView animateWithDuration:1.0 animations:^{
    
        self.tempView.transform = CGAffineTransformRotate(self.tempView.transform, M_PI_4));
    }];
}
  • 这样写我是对上一次的形变对象进行了改变,所以也是可以达到效果。
  • 和上一种比较不用定义全局变量,不用考虑内存。

5、清除形变

①单一形变清空
self.tempView.transform = CGAffineTransformMakeRotation(0);
  • 比如你在开始只做了旋转形变,那么只要将旋转形变参数传0。就回归旋转之前的状态
  • 局限:多种形变嵌套就没办法用这种方式清除了
②清空控件所有形变属性
 self.tempView.transform = CGAffineTransformIdentity;
  • 清空控件所有transform,以前的平移、缩放、旋转都消失,回归控件未做形变之前的状态。
  • 应用拓展:你已经利用transform做了嵌套效果了,过一段时间又想让他慢慢回到初始状态。这个就可以做出开头和结尾对应的效果。就按照原来的效果回去。

如果您有什么疑问或者发现书写歧义,非常感激您能留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容