UIView动画详解

UIView动画   

1.概述

UIKit直接将 动画集成到UIView类中,实现简单 动画的创建过程。UIView类定义了几个内在支持 动画的属性声明,当这些属性发生改变时,视图为其变化过程提供内建的 动画支持。

执行 动画所需要的工作由UIView类自动完成,但仍要在希望执行 动画时通知视图,为此需要将改变属性的代码包装到一个代码块中。

2.UIView动画具体创建方法

- (void)buttonPressed
{
//  交换本视图控制器中2个 view位置
    [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
    //UIView开始 动画,第一个参数是 动画的标识,第二个参数附加的应用程序信息用来传递给 动画代理消息
    [UIView beginAnimations:@"View Flip" context:nil];
    //动画持续时间
    [UIView setAnimationDuration:1.25];
    //设置 动画的回调函数,设置后可以使用回调方法
    [UIView setAnimationDelegate:self];
    //设置 动画曲线,控制 动画速度
    [UIView  setAnimationCurve: UIViewAnimationCurveEaseInOut];
    //设置 动画方式,并指出 动画发生的位置
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view  cache:YES];
    //提交UIView动画
    [UIView commitAnimations];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //主要功能通过UIView动画完成2个试图控制器的切换
    
    self.blueController = [[BlueViewController alloc] initWithNibName:nil bundle:nil];
    //设置导航控制器 view的大小占整个屏幕
    [self.blueController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width , self.view.frame.size.height)];
    
    self.yellowController = [[YellowController alloc]initWithNibName:nil bundle:nil ];
    [self.yellowController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width , self.view.frame.size.height)];
    //将2个控制器 view插入到目前导航控制器视图上,yellowController后插入,显示在最前面
    [self.view insertSubview:self.blueController.view atIndex:0];
    [self.view insertSubview:self.yellowController.view atIndex:1];
    //创建导航控制器右按钮,按钮名字叫next
    //添加buttonPressed 事件
    self.rightBarItem = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain target:self action:@selector(buttonPressed)];
    //将按钮添加到导航控制器默认右按钮上
    self.navigationItem.rightBarButtonItem = self.rightBarItem;
}

有个问题:如果 动画不放在按钮事件中,直接放到viewDidLoad里,程序首先执行这个controller,这时 动画是不会显示的。

原因:出现这个问题是因为开机时候系统有个 动画,系统 动画和这个 动画重复了。

解决方案:

1。将 动画写在按钮事件中

2。利用定时器。


转:UIView动画更具体讲解; http://wsqwsq000.iteye.com/blog/1189183

areAnimationsEnabled

返回一个布尔值表示 动画是否结束。
+ (BOOL)areAnimationsEnabled
返回值
如果 动画结束返回YES,否则NO。



beginAnimations:context:

开始一个 动画
+ (void)beginAnimations:(NSString *)animationID context:(void *)context
参数
animationID
动画块内部应用程序标识用来传递给 动画代理消息-这个选择器运用setAnimationWillStartSelector:和setAnimationDidStopSelector: 方法来设置。
context
附加的应用程序信息用来传递给 动画代理消息-这个选择器使用setAnimationWillStartSelector: 和setAnimationDidStopSelector: 方法。
讨论
这个值改变是因为设置了一些需要在 动画块中产生 动画的属性。 动画块可以被嵌套。如果在没有在 动画块中调用那么setAnimation类方法将什么都不做。使用 beginAnimations:context:来开始一个 动画块并用commitAnimations类方法来结束一个 动画块。


commitAnimations

结束一个 动画块并开始当他在 动画块外时。
+ (void)commitAnimations
讨论
如果当前的 动画块是最外层的 动画块,当应用程序返回到循环运行时开始 动画块。 动画在一个独立的线程中所有应用程序不会中断。使用这个方法,多个 动画可以被实现。查看setAnimationBeginsFromCurrentState:来了解如果开始一个 动画当另外一个 动画在播放的时候。


layerClass

返回类用来创建这一个本类的layer实例对象。
+ (Class)layerClass
返回值
一个用来创建视图layer的类
讨论
重写子类来指定一个自定义类用来显示。当在创建视图layer时候调用。默认的值是CALayer类对象。


setAnimationBeginsFromCurrentState
:
设置 动画从当前状态开始播放。
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState
参数
fromCurrentState
YES如果 动画需要从他们当前状态开始播放。否则为NO。
讨论
如果设置为YES那么当 动画在运行过程中,当前视图的位置将会作为新的 动画的开始状态。如果设置为NO,当前 动画结束前新 动画将使用视图最後状态的位置作 为开始状态。这个方法将不会做任何事情如果 动画没有运行或者没有在 动画块外调用。使用beginAnimations:context:类方法来开始并用 commitAnimations类方法来结束 动画块。默认值是NO。


setAnimationCurve
:
设置 动画块中的 动画属性变化的曲线。
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve
讨论
动画曲线是 动画运行过程中相对的速度。如果在 动画块外调用这个方法将会无效。使用 beginAnimations:context:类方法来开始 动画块并用commitAnimations来结束 动画块。默认 动画曲线的值是UIViewAnimationCurveEaseInOut。



setAnimationDelay:

动画块中设置 动画的延迟属性(以秒为单位)
+ (void)setAnimationDelay:(NSTimeInterval)delay
讨论
这个方法在 动画块外调用无效。使用beginAnimations:context: 类方法开始一个 动画块并用commitAnimations类方法结束 动画块。默认的 动画延迟是0.0秒。



setAnimationDelegate:

设置 动画消息的代理。
+ (void)setAnimationDelegate:(id)delegate
参数
delegate
你可以用setAnimationWillStartSelector:和setAnimationDidStopSelector: 方法来设置接收代理消息的对象。
讨论
这个方法在 动画块外没有任何效果。使用beginAnimations:context:类方法开始一个 动画块并用commitAnimations类方法结束一个 动画块。默认值是nil



setAnimationDidStopSelector:

设置消息给 动画代理当 动画停止的时候。
+ (void)setAnimationDidStopSelector:(SEL)selector
参数
selector
动画结束的时候发送给 动画代理。默认值是NULL。这个选择者须有下面方法的签名:animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context。
animationID
一个应用程序提供的标识符。和传给beginAnimations:context: 相同的参数。这个参数可以为空。
finished
如果 动画在停止前完成那返回YES;否则就是NO。
context
一个可选的应用程序内容提供者。和beginAnimations:context: 方法相同的参数。可以为空。
讨论
这个方法在 动画块外没有任何效果。使用beginAnimations:context: 类方法来开始一个 动画块并用commitAnimations类方法结束。默认值是NULL。



setAnimationDuration:

设置 动画块中的 动画持续时间(用秒)
+ (void)setAnimationDuration:(NSTimeInterval)duration
参数
duration
一段 动画持续的时间。
讨论
这个方法在 动画块外没有效果。使用beginAnimations:context: 类方法来开始一个 动画块并用commitAnimations类方法来结束一个 动画块。默认值是0.2。



setAnimationRepeatAutoreverses:
设置 动画块中的 动画效果是否自动重复播放。
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses
参数
repeatAutoreverses
如果 动画自动重复就是YES否则就是NO。
讨论
自动重复是当 动画向前播放结束後再重头开始播放。使用setAnimationRepeatCount: 类方法来指定 动画自动重播的时间。如果重复数为0或者在 动画块外那将没有任何效果。使用beginAnimations:context:类方法来开始一个 动画块并用commitAnimations方法来结束一个 动画块。默认值是NO。



setAnimationRepeatCount:

设置 动画动画模块中的重复次数
+ (void)setAnimationRepeatCount:(float)repeatCount
参数
repeatCount
动画重复的次数,这个值可以是分数。
讨论
这个属性在 动画块外没有任何作用。使用beginAnimations:context:类方法来开始一个 动画块并用commitAnimations类方法来结束。默认 动画不循环。



setAnimationsEnabled:
设置是否激活 动画
+ (void)setAnimationsEnabled:(BOOL)enabled
参数
enabled
如果是YES那就激活 动画;否则就是NO
讨论
动画参数没有被激活那么 动画属性的改变将被忽略。默认 动画是被激活的。



setAnimationStartDate:
设置在 动画块内部 动画属性改变的开始时间
+ (void)setAnimationStartDate:(NSDate *)startTime
参数
startTime
一个开始 动画的时间
讨论
使用beginAnimations:context:类方法来开始一个 动画块并用commitAnimations类方法来结束 动画块。默认的开始时间值由CFAbsoluteTimeGetCurrent方法来返回。




setAnimationTransition:forView:cache:
动画块中为视图设置过渡
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *) view cache:(BOOL)cache
参数
transition
把一个过渡效果应用到视图中。可能的值定义在UIViewAnimationTransition中。
view
需要过渡的视图对象。
cache
如果是YES,那么在开始和结束图片视图渲染一次并在 动画中创建帧;否则,视图将会在每一帧都渲染。例如缓存,你不需要在视图转变中不停的更新,你只需要等到转换完成再去更新视图。
讨论
如果你想要在转变过程中改变视图的外貌。举个例子,文件从一个视图到另一个视图,然後使用一个UIView子类的容器视图,如下:
1.Begin an animation block.
2.Set the transition on the container  view.
3.Remove the subview from the container  view.
4.Add the new subview to the container  view.
5.Commit the animation block.
1.开始一个 动画块。 2.在容器视图中设置转换。 3.在容器视图中移除子视图。 4.在容器视图中添加子视图。 5.结束 动画块。



setAnimationWillStartSelector:

动画开始时发送一条消息到 动画代理
+ (void)setAnimationWillStartSelector:(SEL)selector
参数
selector
动画开始前向 动画代理发送消息。默认值是NULL。这个selector必须由和beginAnimations:context: 方法相同的参数,一个任选的程序标识和内容。这些参数都可以是nil。
讨论
这个方法在 动画块外没有任何作用。使用beginAnimations:context:类方法来开始一个 动画块并用commitAnimations类方法来结束。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值