2. UIView的动画

UIView类本身具有动画的功能

2.1 概念

由UI对底层Core Animation框架的封装

可以轻松简单的实现动画效果

2.2 两种使用方式

1> Block

基本步骤

1>设置参与动画的视图的初始状态   alpha=0.0

2>[UIView animateWithDuration:]

3>将结束状态写到block中

例1

- (IBAction)start:(id)sender {
[UIView animateWithDuration:3.0 animations:^{
self.imageView.alpha = 1.0;// 目标值
}];
}

例2

// 界面显示后调用此方法,一般用来设置动画
-(void)viewDidAppear:(BOOL)animated{
// label动画
[super viewDidAppear:animated];
CGRect endFrame = self.label.frame;
CGRect startFrame = endFrame;
startFrame.origin.x = - self.label.frame.size.width;
self.label.frame = startFrame;// frame开始值
self.label.alpha = ;// 透明度开始值
[UIView animateWithDuration:2.0 animations:^{
self.label.frame = endFrame;// frame结束值
self.label.alpha = 1.0;// 透明度结束值
}];
// 飞机入场
self.imageView.image = [UIImage animatedImageNamed:@"ship-anim" duration:1.0];
endFrame = self.imageView.frame;
startFrame = endFrame;
startFrame.origin.y = self.view.frame.size.height;
self.imageView.frame = startFrame;
[UIView animateWithDuration:2.0 animations:^{
self.imageView.frame = endFrame;
}];
}
- (IBAction)start:(id)sender {
CGPoint center = self.imageView.center;
center.y -= ;
// CGAffineTransform transform = CGAffineTransformRotate(self.imageView.transform, M_PI);
// CGAffineTransform transform = CGAffineTransformMakeScale(1.5, 1.5);
// Duration动画时长 delay延迟
[UIView animateWithDuration:2.0 delay: options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^{
self.imageView.center = center;
// self.imageView.transform = transform;
} completion:nil]; } - (IBAction)back:(id)sender {
CGRect endFrame = self.imageView.frame;
endFrame.origin.y += ;
[UIView animateWithDuration:1.0 delay: options:UIViewAnimationOptionCurveEaseIn animations:^{
self.imageView.frame = endFrame;
} completion:nil];
}

例3

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self animateOnView:self.imageView duration:1.0 clockWise:NO];// clockWise YES顺时针
}
-(void)animateOnView:(UIView *)view duration:(NSTimeInterval)duration clockWise:(BOOL)clockWise{
// completion动画结束要做的事
[UIView animateWithDuration:duration delay: options:UIViewAnimationOptionCurveLinear animations:^{
view.transform = CGAffineTransformRotate(view.transform, M_PI_2 * (clockWise ? : -));
} completion:^(BOOL finished) {
if (!self.needStoped) {
// 递归调用
[self animateOnView:view duration:duration clockWise:clockWise];
}
}];
}
// 停止动画
- (IBAction)stopAnimation:(id)sender {
self.needStoped = YES;
}
// 恢复动画
- (IBAction)startAnimation:(id)sender {
self.needStoped = NO;
[self viewDidAppear:YES];
}

2> Commit

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// 1开始一个动画,给动画起个名字,
[UIView beginAnimations:@"snow" context:nil];
// 2设置动画相关属性
[UIView setAnimationDuration:4.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
// 3动画目标值
self.snow.center = CGPointMake(self.snow.center.x, self.view.bounds.size.height - self.snow.frame.size.height);
// 4提交动画,动画开始
[UIView commitAnimations];
}

2.3 什么属性能做动画的设置属性

.frame

.bounds

.center

.transform

.alpha

稍复杂的动画[MX6-飘雪花练习]

#define MAX_SIZE 10
#define MAX_DURATION 5//速度
#define MAX_OFFSET_X 100
#define FPS 30
#define DISAPPER_DURATION 2 @interface MXViewController ()
@property(nonatomic) NSInteger count;
@property(nonatomic,strong) NSTimer *timer;
@end @implementation MXViewController - (void)viewDidLoad
{
[super viewDidLoad];
// [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(viewDidAppear:) userInfo:nil repeats:YES];
self.timeInterVal = /FPS;
} -(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[NSTimer scheduledTimerWithTimeInterval:self.timeInterVal target:self selector:@selector(generatorSnow) userInfo:nil repeats:YES];
}
// 生成雪片
-(void)generatorSnow{
self.count++;
// 创建随机大小的雪花
NSInteger size = arc4random() % MAX_SIZE + MAX_SIZE;
UIImageView *snow = [[UIImageView alloc] initWithFrame:CGRectMake(arc4random() % , , size, size)];
snow.image = [UIImage imageNamed:@"snow.png"];
snow.tag = self.count;
// 加入到父视图中
[self.view addSubview:snow]; // 创建动画
[UIView beginAnimations:[NSString stringWithFormat:@"%d",self.count] context:nil];
[UIView setAnimationDuration:arc4random() % MAX_DURATION + ];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; // 设置了delegate,动画结束后才会自动调用disappearAnimate:
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(disappearAnimate:)];// 动画结束后调用disappearAnimate NSInteger offSetX = arc4random() % MAX_OFFSET_X - ;
// 设置动画目标值
snow.center = CGPointMake(snow.center.x + offSetX, self.view.bounds.size.height - );
snow.transform = CGAffineTransformMakeRotation((arc4random() % )/ * M_PI * );
[UIView commitAnimations];
}
- (IBAction)changeSnow:(UISlider *)sender {
CGFloat value = sender.maximumValue - sender.value;
self.timeInterVal = value * FPS;
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeInterVal target:self selector:@selector(generatorSnow) userInfo:nil repeats:YES];
}
// 雪花消失
-(void)disappearAnimate:(NSString *)animationId{
[UIView beginAnimations:animationId context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:arc4random() % DISAPPER_DURATION + ]; [UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(deleteView:)]; UIImageView *snow = (UIImageView *)[self.view viewWithTag:[animationId intValue]];
snow.alpha = ;
[UIView commitAnimations];
}
// 删除雪花对象
-(void)deleteView:(NSString *)animationId{
UIImageView *snow = (UIImageView *)[self.view viewWithTag:[animationId intValue]];
[snow removeFromSuperview];// 删除子视图的方式
// NSLog(@"雪花对象:%p,雪花数量:%d",snow,[self.view subviews].count);
}

2.4 UIView执行动画的方法:

[UIView animateWithDuration:duration delay:delay             options:UIViewAnimationOptionCurveEaseIn animations:^{

self.playerView.frame = endFrame;

} completion:nil];

duration:  动画时长(秒)

delay: 启动动画的延迟(秒)

animations:

设置动画结束后的状态

completion:

动画结束后需要做事的

options:

UIViewAnimationOptionCurveEaseInOut 动画先从慢到快,再从快到慢

UIViewAnimationOptionCurveEaseIn    越来越快

UIViewAnimationOptionCurveEaseOut   越来越慢

UIViewAnimationOptionCurveLinear    匀速

UIViewAnimationOptionAllowUserInteraction  在动画期间是否允许用户交互

UIViewAnimationOptionBeginFromCurrentState  动画要不要从当前位置开始,如果不选,那就从初始位置开始

UIViewAnimationOptionRepeat   动画重复执行

UIViewAnimationOptionAutoreverse   动画是否需要反向执行

UIViewAnimationOptionLayoutSubviews 当动画发生大小变化时,是否需要重新布局

UIViewAnimationOptionAllowAnimatedContent  在动画的同时要不要执行Redraw

旋转动画

2.5 UIView设置全局属性方式动画

1>设置开始状态

2>开始动画,并给动画命名

[UIView beginAnimations:@"动画名" ….];

3>设置动画相关属性

[UIView setAnimationDuration:…];

[UIView setAnimationCurve:…];

….

4>设置动画结束状态

5>提交动画

[UIView commitsAnimation];

注意:

当设置了delegate后,DidStopSelector才会有效。

[UIView setAnimationDelegate:self];

[UIView setAnimationDidStopSelector:@selector(..)];

3. iOS7新增DynamicAnimator

@interface MXViewController () <UIDynamicAnimatorDelegate>
@property(nonatomic,strong) UIDynamicAnimator *animator;//
@property(nonatomic,strong) UIDynamicBehavior *behavior;// 行为(容器)
@property(nonatomic,strong) UIGravityBehavior *gravity;// 重力
@property(nonatomic,strong) UICollisionBehavior *collision;// 碰撞 @end @implementation MXViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
-(UIGravityBehavior *)gravity{
if (!_gravity) {
_gravity = [[UIGravityBehavior alloc] init];
_gravity.magnitude = 0.9;// 重力值
}
return _gravity;
}
-(UICollisionBehavior *)collision{
if (!_collision) {
_collision = [[UICollisionBehavior alloc] init];
_collision.translatesReferenceBoundsIntoBoundary = YES;// 周围边界翻译为碰撞边界
}
return _collision;
}
-(UIDynamicBehavior *)behavior{ if (!_behavior) {
_behavior = [[UIDynamicBehavior alloc] init];
[_behavior addChildBehavior:self.gravity];
[_behavior addChildBehavior:self.collision];
}
return _behavior;
}
-(UIDynamicAnimator *)animator{
if (!_animator) {
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
_animator.delegate = self;
}
return _animator;
}
- (IBAction)dropTap:(id)sender {
UIView *dropView = [[UIView alloc] initWithFrame:CGRectMake(arc4random() % , , , )];
dropView.backgroundColor = [self roundColor];
[self.view addSubview:dropView];
[self.gravity addItem:dropView];
[self.collision addItem:dropView];
[self.animator addBehavior:self.behavior]; }
-(UIColor *)roundColor{
switch (arc4random() % ) {
case :
return [UIColor greenColor];
break;
case :
return [UIColor grayColor];
break;
case :
return [UIColor redColor];
break;
case :
return [UIColor yellowColor];
break;
case :
return [UIColor blackColor];
break;
default:
break;
}
return nil;
}
-(void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator{
[animator removeBehavior:self.behavior];
}

作业:

1. 飞机大战Demo版

屏幕上有一个飞机,你点在屏幕的哪,飞机就飞到哪儿

2. 模仿一个淘宝的购物车

窗口左上角一个一图片,代表一个宝贝,点宝贝,会落入屏幕下方的一个小车车中,落下时,宝贝会越来越小,注意宝贝本身还在。

3. 简单看看UIDynamicAnimator文档

17-UIKit(UIView的动画)的更多相关文章

  1. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

  2. ios uiview封装动画(摘录)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

  3. 核心动画(UIView封装动画)

    一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...

  4. UIKit中ImageView动画堆叠显示的微调整

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 网上看到一个PackingList项目(如果需要源代码可以Q我 ...

  5. 核心动画(UIView封装动画)-转

    一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持. 执行动画所需要的工作由UIView类自动完成 ...

  6. iOS开发——动画编程Swift篇&(一)UIView基本动画

    UIView基本动画 // MARK: - UIView动画 ------------------------------------- // MARK: - UIView动画-淡入 @IBActio ...

  7. IOS UIVIEW layer动画 总结(转)

    转发自:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/16306_12.html   IOS UIVIEW layer动画 总结, ...

  8. 用layer添加UIView的动画

    项目有时会遇到用UIView 添加动画的情况,这里我觉得在layer上添加动画比较好,因为可以详细地设定动画属性,方便理解 下面是一个旋转动画: -(void)roundBtnAction:(id)s ...

  9. IOS开发-UIView之动画效果的实现方法(合集)

    http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化 ...

随机推荐

  1. 阵列中条带(stripe)、stripe unit

    摘抄:http://blog.sina.com.cn/s/blog_4a362d610100aed2.html 在磁盘阵列中,数据是以条带(stripe)的方式贯穿在磁盘阵列所有硬盘中的.这种数据的分 ...

  2. .net Windows服务程序和安装程序制作图解

    最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...

  3. 实现AJAX局部刷新以及PageMethod方法的使用

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  4. Java学习01

    Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...

  5. BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间( dp )

    水dp 先按开始时间排序 , 然后dp. dp( i ) 表示前 i 个时间段选第 i 个时间段的最优答案 , 则 dp( i ) = max( dp( j ) ) + w_i ( 0 < j ...

  6. jbpmAPI-1

    1.1. What is jBPM? jBPM是一个灵活的业务流程管理(BPM)套件.它是轻量级的,完全开源Apache许可下(分布式),用Java编写的.它允许您模型.执行和监控业务流程的整个生命周 ...

  7. js正则:零宽断言

    JavaScript正则表达式零宽断言 var str="abnsdfZL1234nvcncZL123456kjlvjkl"var reg=/ZL(\d{4}|\d{6})(?!\ ...

  8. Linux下同步工具inotify+rsync使用详解

    1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这 ...

  9. cocos2dx进阶学习之CCAction

    CCAction在cocos2dx中,抽象了节点的动作.它由CCObject派生,因此它不是渲染节点. 它经常的用法是,创建一个action,然后让某个CCNode对象(一般是精灵),去执行它. 在马 ...

  10. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动

    马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...