因为项目需求,需要如下这样一个简单的动画效果:


####单个控件 这个动画效果,如果对控件使用UIView的block动画,设置控件的Frame值,是可以实现的.

比如下面这个效果:

我们可以代码来简单实现上面的效果:

- (void)viewDidLoad {    [super viewDidLoad];

    self.btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];    [self.btn setImage:[UIImage imageNamed:@"1"] forState:UIControlStateNormal];    [self.view addSubview:self.btn];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [UIView animateWithDuration:1.0 animations:^{        self.btn.frame = CGRectMake(100, 300, 200, 0);    }];}复制代码

####如果是多个控件呢? 我们比葫芦画瓢,把btn放到一个View当中,我们再对View使用一个UIView的block动画. 首先看下代码:

- (void)viewDidLoad {    [super viewDidLoad];

    self.outView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-44)];    self.outView.backgroundColor = [UIColor redColor];

    self.btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];    [self.btn setImage:[UIImage imageNamed:@"1"] forState:UIControlStateNormal];

    [self.outView addSubview:self.btn];    [self.view addSubview:self.outView];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [UIView animateWithDuration:1.0 animations:^{        self.outView.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height-44, [UIScreen mainScreen].bounds.size.width, 0);    }];}复制代码

然后我们看下效果:

红色的View发生了形变,但是里面的控件并没有跟着缩放. 看来这个方案不行. 我想,应该可以用CGAffineTransform来进行一个动画缩放. 然后把上面 self.outView.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height-44, [UIScreen mainScreen].bounds.size.width, 0); 替换成 self.outView.layer.affineTransform = CGAffineTransformScale(self.outView.layer.affineTransform, 1.0, 0.001);(这里的sy如果为0的话,会直接消失.)然后动画效果是下面这样的: 很明显不符合我们的要求,我想要控件的底部不动,从上面开始进行压缩下来.


####anchorPoint, position, CGAffineTransform 是的,通过这三个东西,来实现,首先我们上代码和实现图,然后再进行分析.

- (void)viewDidLoad {    [super viewDidLoad];

    self.outView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-44)];    self.outView.backgroundColor = [UIColor redColor];

    self.btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];    [self.btn setImage:[UIImage imageNamed:@"1"] forState:UIControlStateNormal];

    [self.outView addSubview:self.btn];    [self.view addSubview:self.outView];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //注意这里不能使用self.outView.frame因为Frame会随着控件的变化而变化.    //这样就导致了layer的position的位置不准确了.    CGFloat positionX = 0.5*self.outView.bounds.size.width;    CGFloat positionY = 1.0*self.outView.bounds.size.height;    self.outView.layer.anchorPoint = CGPointMake(0.5, 1);    self.outView.layer.position = CGPointMake(positionX, positionY);

    [UIView animateWithDuration:1.0 animations:^{        self.outView.layer.affineTransform = CGAffineTransformScale(self.outView.layer.affineTransform, 1, 0.001);    }];}复制代码

效果:

这下就完美了,红色的View和它里面的子控件一起进行了缩放. 关键点就那两行代码,设置了 outView 的anchor和position. 关于anchor和position的文章,网上有很多介绍的.我这里就不再进行赘述. position的x = view.bounds.size.width * anchorPoint.x; x = view.bounds.size.height * anchorPoint.y; 当你改变anchorPoint的值的时候,要确保position的值也进行了相应的改变,否则会产生View的位置不正确.

转载于:https://juejin.im/post/5a376c5451882560b6526ac6

iOS压缩动画 CGAffineTransform相关推荐

  1. iOS 核心动画 Core Animation浅谈

    代码地址如下: http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVi ...

  2. ios uiview动画_iOS UIView动画

    ios uiview动画 In this tutorial, we'll be animating our UI Views in various ways in the iOS Applicatio ...

  3. 微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常

    问题以及解决: 吐槽遇到的问题~ 在写微信小程序的时候,采用wx.canvasToTempFilePath压缩图片且上传的时候,安卓一切正常,我在开发工具上也一切正常,偏偏ios上就不正常,不正常不是 ...

  4. [iOS]过渡动画之高级模仿 airbnb

    注意:我为过渡动画写了两篇文章: 第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 M ...

  5. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  6. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  7. 在线gif压缩文件大小_如何在不损失图像质量的情况下压缩动画GIF文件

    在线gif压缩文件大小 动画GIF比任何其他数字图像格式都已根深蒂固于在线文化中. JPEG或多或少是传统摄影的延续,但GIF是新的且功能强大. 在过去的十年中,广泛的宽带已导致视频流传输,但是在此之 ...

  8. ae制h5文字动画_大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    前段时间听部门老大说,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在AE上做好的动画导出为json文件,然后以Android/iOS原生动画的形 ...

  9. iOS 常用动画第三方

    动画 Core Animation笔记,基本的使用方法 - Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组. awesome- ...

最新文章

  1. SQL Server查询重复数据
  2. [yc]详解link
  3. java 人脸检测_Java+OpenCV实现人脸检测并自动拍照
  4. Python基础——PyCharm版本——第二章、数据类型和变量(超详细)
  5. IntelliJ IDEA16 热部署,解决每次修改java文件就得重启tomcat的问题
  6. 小白的算法初识课堂(part3)--递归
  7. php,Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes)
  8. 阿里云史上最大技术升级:面向万物智能的飞天2.0
  9. java容器doc_关于Java容器类学习心得体会.doc
  10. WordPress国外开源主题Enigma h1、h2、h3……标题不显示的解决办法
  11. 简单了解HttpServer的使用
  12. 【Oracle】Oracle数据库参考价格
  13. laravel admin里百度编辑器自定义路径和文件名
  14. 华为2017年营收突破6000亿;阿里巴巴全球总经理离职;亚马逊将关闭音乐存储服务丨价值早报
  15. 最新出炉的SUN ISV eNews
  16. 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款40元iOS游戏应用共享帐号...
  17. 「精研科技」× 企企通,全球MIM龙头借助采购供应商数字化向多领域突破
  18. 【分享】许多 有意思的 颜文字表情包
  19. C++编写x的n次方
  20. Elixir-Atoms

热门文章

  1. C++ code:string stream(string流)学习大全
  2. C++ initializer_list 类型详解
  3. mysql配置不成功_mysql 5.7.17 zip安装配置教程 mysql启动失败的解决方法
  4. java数据结构排序实验报告_java数据结构与算法之插入排序详解
  5. springSecurity源码分析——DelegatingFilterProxy类的作用
  6. oracle cast multiset table 语法演示
  7. 大数据量Excel Import导致OOM问题
  8. XSD(Schema)教程
  9. ServiceMix中文教程
  10. 亲手搭建一个基于Asp.Net WebApi的项目基础框架1