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。利用定时器。




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类方法来结束。

欢迎学习本文,未经许可,禁止转载!

iOS 动画总结—UIView动画的更多相关文章

  1. iOS动画1 — UIView动画

    iOS动画基础是Core Animation核心动画.Core Animation是iOS平台上负责图形渲染与动画的基础设施.由于核心动画的实现比较复杂,苹果提供了实现简单动画的接口—UIView动画 ...

  2. 核心动画和UIView动画的区别

    核心动画和UIView动画的区别 1.核心动画制作用在Layer 2.核心动画的修改的属性都是假象,他的真实位置没有发生变化()

  3. iOS核心动画以及UIView动画的介绍

    我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...

  4. ios中layer动画和UIView动画代码总结

    kCATransitionFade淡出  kCATransitionMoveIn覆盖原图  kCATransitionPush推出  kCATransitionReveal底部显出来    pageC ...

  5. 转-iOS 动画总结----UIView动画

    来自:http://blog.csdn.net/huifeidexin_1/article/details/7597868/ 1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过 ...

  6. ios开发核心动画七:核心动画与UIView动画的区别

    /** UIView与核心动画区别?(掌握) 1.核心动画只作用在layer. 2.核心动画看到的都是假像,它并没有去修改UIView的真实位置. 什么时候使用核心动画? 1.当不需要与用户进行交互, ...

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

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

  8. iOS动画篇:UIView动画

    iOS的动画效果一直都很棒很,给人的感觉就是很炫酷很流畅,起到增强用户体验的作用.在APP开发中实现动画效果有很多种方式,对于简单的应用场景,我们可以使用UIKit提供的动画来实现. UIView动画 ...

  9. iOS - UIView 动画

    1.UIView 动画 核心动画 和 UIView 动画 的区别: 核心动画一切都是假象,并不会真实的改变图层的属性值,如果以后做动画的时候,不需要与用户交互,通常用核心动画(转场). UIView ...

随机推荐

  1. 记录一些移动端H5,小程序视觉还原问题及方法

    前端,特别是移动端如果对视觉还原要求比较高的时候.功能测试和性能测试完成之后.UI真的是一个像素一个像素的给你抠出来哪里还原不到位 之前项目要求还原度要达到98%以上.所以每到视觉还原的时候真的是挺痛 ...

  2. 利用github webhook 结合openresty自动更新静态博客

    使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上. 对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就 ...

  3. MySQL系列教程(一)

    摘要 MySQL的最初的核心思想,主要是开源.简便易用.其开发可追溯至1985年,而第一个内部发行版本诞生,已经是1995年.到1998年,MySQL已经可以支持10中操作系统了,其中就包括win平台 ...

  4. iOS-改变UITextField的Placeholder颜色的三种方式

    转自:http://blog.csdn.net/mazy_ma/article/details/51775670 有时,UITextField自带的Placeholder的颜色太浅或者不满足需求,所以 ...

  5. Swift 3中新的访问控制关键字fileprivate和open

    在Swift 3中除去原有的3个访问控制关键字private,public,internal,又添加了2个关键字fileprivate和open 它们可以看成是对private和public的进一步细 ...

  6. ubuntu日志文件管理

    众所周知,ubuntu的日志文件会越来越大,需要定期管理 logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循).压缩以及删除旧的日志文件.例如,你可以设置logrotate,让/v ...

  7. springMVC源码分析--AbstractDetectingUrlHandlerMapping(五)

    上一篇博客springMVC源码分析--AbstractUrlHandlerMapping(三)中我们介绍了AbstractUrlHandlerMapping,主要介绍了一个handlerMap的ur ...

  8. Openresty 数据共享API.Data Sharing within an Nginx Worker

    摘要自:https://github.com/openresty/lua-nginx-module/#data-sharing-within-an-nginx-worker 每nginx worker ...

  9. Linux 高性能服务器编程——IP协议详解

    1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的.     ...

  10. Java 拓展之调用其他语言

    目前而言,编程语言真的是太多了.每一种都是一种智慧的结晶,但是每个都存在其缺点.网上经常能看到一些程序员争论"XX是世界上最好的语言"之类的话题.其实我们大可不必这样.语言本身只是 ...