IOS控件动画的一种通用方法

最近在做一个垂直弹幕控件 , 在做控件动画时费了不少心思, 这里分享一些心得.

前言

关于动画, 我们一般使用UIKit提供的动画来实现.

UIView动画可以设置的动画属性有:

  • 大小变化(frame)
  • 拉伸变化(bounds)
  • 中心位置(center)
  • 矩阵(transform)
  • 透明度(alpha)
  • 背景颜色(backgroundColor)
  • 拉伸内容(contentStretch)

这里主要介绍transform这个属性.

CGAffineTransform transform的类型是CGAffineTransform , 这是一个2D矩阵.

矩阵的基本知识

struct CGAffineTransform
{
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};
CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty);

为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成。 以上参数在矩阵中的表示为:

[ 1 ]

运算原理:原坐标设为(X,Y,1);

[ 2 ]

通过矩阵运算后的坐标[aX + cY + tx bX + dY + ty 1],我们对比一下可知: 第一种: 设a=d=1, b=c=0. [aX + cY + tx bX + dY + ty 1] = [X + tx Y + ty 1]; 可见,这个时候,坐标是按照向量(tx,ty)进行平移, 其实这也就是函数的计算原理。

CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty)

第二种

设b=c=tx=ty=0. [aX + cY + tx bX + dY + ty 1] = [aX dY 1]; 可见,这个时候,坐标X按照a进行缩放,Y按照d进行缩放,a,d就是X,Y的比例系数,其实这也就是函数

CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)

的计算原理。a对应于sx,d对应于sy。

第三种:设tx=ty=0,a=cosɵ,b=sinɵ,c=-sinɵ,d=cosɵ。 [aX + cY + tx bX + dY + ty 1] = [Xcosɵ - Ysinɵ Xsinɵ + Ycosɵ 1] ; 可见,这个时候,ɵ就是旋转的角度,逆时针为正,顺时针为负。其实这也就是函数

CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)

的计算原理。angle即ɵ的弧度表示。

总体来说, 记住下面这个结论就好.

对于CGAffineTransformMake(a,b,c,d,tx,ty) ad缩放bc旋转tx,ty位移

应用

如何做一个 指定锚点的缩放动画.

分析: 缩放动画 只需要改变b , d 的值即可. 但是此时控件的锚点是在中心点. 把当前中心点移动到你想要的点即可 , 例如, 把锚点放在相对控件原点(0,0)

//设置开始状态
CGFloat offsetX = 0 - view.size.width/2;
CGFloat offsetY = 0 - view.size.height/2;
//0.1 , 0.1 缩放到原来大小的0.1倍, 把原点放到(0,0)
view.transform = CGAffineTransformMake(0.1, 0, 0, 0.01, offsetX, offsetY);
[UIView animateWithDuration:0.5 delay:0.7 
options:UIViewAnimationOptionCurveLinear 
animations:^{
   //放大到1倍, 位移到原点
     view.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
        } completion:^(BOOL finished){}];

可以看到. 只使用一次变换就完成了一次位移和缩放的动画.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端儿

Web 前端颜色值--字体--使用,整理整理

颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义。对光源进行设置的最低值可以是 0(十六进制 00)。最高值是 2...

2992
来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

591
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

6846
来自专栏Hadoop数据仓库

Oracle sqlldr 如何导入一个日期列

1. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY X'9' TRAILING NULLCO...

1906
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

2778
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1272
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

1.1K4
来自专栏tkokof 的技术,小趣及杂念

随便聊聊水面效果的2D实现(二)

之前提到想要随便聊一聊RippleEffect的2D实现方法,近来又总算有了些许空余时间,于是便有了这篇东西~

2063
来自专栏余生开发

echarts太阳分布图-饼图来回穿梭

var dom = document.getElementById("container");

1672
来自专栏Petrichor的专栏

Dataset 列表:机器学习研究

In computer vision, face images have been used extensively to develop face recog...

2211

扫码关注云+社区