iOS利用仿射变换(CGAffineTransform)制作动画效果
2016-01-08 13:06
483 查看
声明:本文是学习iOS-7-Cookbook的例子。
先看看效果图:
![](https://img-blog.csdn.net/20160108123723492?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
该动画的实现分为2部分,红色方框的出现和消失。而每个部分又分两个过程,如红框出现时,它先放大到最大,然后恢复正常大小;消失时先放大到最大,然后消失。在代码中实现的话可以顺着这个逻辑,一步一步走下来。但这样写,显然没什么水平,这里介绍一种很优雅的写法。
原理:
动画中的出现和消失可看做相同的方法,它们都有两个动作,因此会调用两次动画方法。
代码展示:
// Additional example - utilizing AnimationHelper
- (void)actionZoom
{
CGFloat midX = CGRectGetMidX(self.view.bounds);
CGFloat midY = CGRectGetMidY(self.view.bounds);
CGAffineTransform transientTransform = CGAffineTransformMakeScale(1.2f, 1.2f);
CGAffineTransform shrinkTransform = CGAffineTransformMakeScale(0.0001f, 0.0001f);
// Init
[self enable:NO];
bounceView.center = CGPointMake(midX, midY);
bounceView.transform = shrinkTransform;
// Go
CompletionBlock allDone = ^(BOOL done){[self enable:YES];};
//动画第二部分,方框消失
CompletionBlock done = ^(BOOL done){sleep(2); [AnimationHelper viewAnimation:bounceView viaTransform:transientTransform toTransform:shrinkTransform completion:allDone]();};
//第一部分,方框出现
AnimationBlock block = [AnimationHelper viewAnimation:bounceView viaTransform:transientTransform toTransform:CGAffineTransformIdentity completion:done];
block();
}
说明:actionZoom是点击zoom按钮时调用的方法。
这种动画的写法非常优雅,能很好地控制动画效果,应该是非常经典的例子!!
demo下载
先看看效果图:
该动画的实现分为2部分,红色方框的出现和消失。而每个部分又分两个过程,如红框出现时,它先放大到最大,然后恢复正常大小;消失时先放大到最大,然后消失。在代码中实现的话可以顺着这个逻辑,一步一步走下来。但这样写,显然没什么水平,这里介绍一种很优雅的写法。
原理:
动画中的出现和消失可看做相同的方法,它们都有两个动作,因此会调用两次动画方法。
代码展示:
typedef void (^AnimationBlock)(void); typedef void (^CompletionBlock)(BOOL finished);
// Additional example - utilizing AnimationHelper
- (void)actionZoom
{
CGFloat midX = CGRectGetMidX(self.view.bounds);
CGFloat midY = CGRectGetMidY(self.view.bounds);
CGAffineTransform transientTransform = CGAffineTransformMakeScale(1.2f, 1.2f);
CGAffineTransform shrinkTransform = CGAffineTransformMakeScale(0.0001f, 0.0001f);
// Init
[self enable:NO];
bounceView.center = CGPointMake(midX, midY);
bounceView.transform = shrinkTransform;
// Go
CompletionBlock allDone = ^(BOOL done){[self enable:YES];};
//动画第二部分,方框消失
CompletionBlock done = ^(BOOL done){sleep(2); [AnimationHelper viewAnimation:bounceView viaTransform:transientTransform toTransform:shrinkTransform completion:allDone]();};
//第一部分,方框出现
AnimationBlock block = [AnimationHelper viewAnimation:bounceView viaTransform:transientTransform toTransform:CGAffineTransformIdentity completion:done];
block();
}
#pragma mark - Transform - + (AnimationBlock)viewAnimation:(UIView *)aView viaTransform:(CGAffineTransform)transientTransform toTransform:(CGAffineTransform)finalTransform withDuration:(CGFloat)firstDuration andDuration:(CGFloat)secondDuration completion:(CompletionBlock)finishBlock { NSLog(@"DEBUG: %f and %f", firstDuration, secondDuration); AnimationBlock primaryAnimation = ^(){ aView.transform = transientTransform; }; AnimationBlock secondaryAnimation = ^(){ aView.transform = finalTransform; }; CompletionBlock middleCompletion = ^(BOOL finished) { [UIView animateWithDuration:secondDuration animations:secondaryAnimation completion:finishBlock]; }; AnimationBlock primaryBlock = ^(){ [UIView animateWithDuration:firstDuration animations: primaryAnimation completion:middleCompletion]; }; return primaryBlock; } /** * 实现两次变形动画 * * @param aView 主视图 * @param transientTransform 第一次变换的效果 * @param finalTransform 第二次变换的效果 * @param finishBlock 动画结束后执行的操作 * * @return 变换执行的入口,第一次变换的block */ + (AnimationBlock)viewAnimation:(UIView *)aView viaTransform:(CGAffineTransform)transientTransform toTransform:(CGAffineTransform)finalTransform completion:(CompletionBlock)finishBlock { return [self viewAnimation:aView viaTransform:transientTransform toTransform:finalTransform withDuration:DEFAULT_TIME andDuration:DEFAULT_TIME completion:finishBlock]; }
说明:actionZoom是点击zoom按钮时调用的方法。
这种动画的写法非常优雅,能很好地控制动画效果,应该是非常经典的例子!!
demo下载
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Gifski:一个跨平台的高质量 GIF 编码器
- 模仿动画的放大缩小容器
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- Android中ViewFlipper的使用及设置动画效果实例详解
- jQuery实现美观的多级动画效果菜单代码
- php判断GIF图片是否为动画的方法
- jQuery实现动画效果circle实例
- 浅析JavaScript动画
- js排序动画模拟-插入排序
- javascript+HTML5的Canvas实现Lab单车动画效果
- 基于javascript实现漂亮的页面过渡动画效果附源码下载
- js实现按钮颜色渐变动画效果
- jQuery实现连续动画效果实例分析