iOS开发:UIView动画详解

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

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

时间: 2024-10-03 11:28:44

iOS开发:UIView动画详解的相关文章

iOS UIView动画详解(Objective-C)

    我在之前的一篇博客中<iOS UIView动画详解(Swift)>讲解了使用Swift来实现UIView类下面提供的多种动画效果,如位置动画.旋转动画.缩放动画.颜色动画.透明度动画等等.为了这个题目的完整性,今天我使用Objective-C来完全重写以上的所有的动画.项目案例已经上传至:https://github.com/chenyufeng1991/iOS-UIView-Animation  中的Animation-OC文件夹下,另一个目录下则是Swift实现的动画. (1)位置

iOS开发UIScrollView使用详解

iOS开发UIScrollView使用详解 一.ScrollView常用方法和属性 @property(nonatomic)CGPoint contentOffset; 设置滚动的偏移量 @property(nonatomic)CGSize contentSize; 设置滑动区域 @property(nonatomic,assign) id<UIScrollViewDelegate>      delegate; 设置UIScrollView的代理 @property(nonatomic,ge

iOS开发 widget构建详解及实现代码_IOS

iOS开发之widget实现 前言     iOS extension的出现,方便了用户查看应用的服务,比如用户可以在Today的widgets中查看应用的简略信息,然后点击进入相关的应用界面. 暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友. 图1 Today的widget展示----以支付宝为例说明 文章将依次从以下几个问题着手,进行详细说明:1.如何为现有的工程添加widget:2.如何绘制UI:3.如何调

IOS实现碎片化动画详解_IOS

碎片化效果图 遮罩视图 在UIView中有一个maskView属性,这个属性是我们今天实现动画的最重要的变量.这个属性在iOS8之后开始使用,用来表示视图的遮罩.什么是遮罩呢?我想了很久都没有找到合适的比喻来介绍这个.简单来说,一个UIView的对象,可以通过设置alpha来改变这个视图的透明度,遮罩的实现效果也是一样的.唯一的差别在于前者是通过修改0~1之间的值来改变透明效果,作为遮罩的视图对象的backgroundColor.alpha.transform等等属性都会影响到被遮盖的视图的透明

Android开发实现带有反弹效果仿IOS反弹scrollview教程详解_Android

首先给大家看一下我们今天这个最终实现的效果图:   这个是ios中的反弹效果.当然我们安卓中如果想要实现这种效果,感觉不会那么生硬,滚动到底部或者顶部的时候.当然 使用scrollview是无法实现的.所以我们需要新建一个view继承ScrollView package davidbouncescrollview.qq986945193.com.davidbouncescrollview; import android.annotation.SuppressLint; import androi

控制器转场动画详解

控制器转场动画详解   效果   说明 1. 控制器转场动画包括了普通控制器的present与dismiss转场动画,还有NavigationController的push与pop转场动画.其中,NavigationController的pop动画包含了回退百分比显示 2. 对转场动画对象进行行为抽象,让使用更加简单 3. 即使简化了使用,控制器转场动画也是属于比较难掌握的   源码 https://github.com/YouXianMing/ViewControllersTransition

IOS React Native FlexBox详解及实例_IOS

IOS React Native FlexBox详解及资料整理, # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所偏差,在学习中如果有错会及时修改内容,也欢迎万能的朋友们批评指出,谢谢 文章第一版出自简书,如果出现图片或页面显示问题,烦请转至 简书 查看 也希望喜欢的朋友可以点赞,谢谢 什么是 FlexBox 布局 在 html 中,界面的搭建都是采用 C

Android 混合动画详解及实现代码_Android

Android 混合动画 在Android开发,我们会经常使用到动画,但是简单的一种动画(如旋转.缩放.渐变.位移等)有时候并不能满足我们项目的要求,这时候就需要运用到混合动画,那么在安卓中是如何实现一个炫酷的混合动画,下面是一个混合动画实现的其中一个实现方式: 1.首先要在res目录下建立一个anim文件,在anim建立一个hybrid.xml文件如下: <?xml version="1.0" encoding="utf-8"?> <set xm

Android 模仿iPhone列表数据View刷新动画详解_Android

因为我本人很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下:既然好玩就写在博客中,直接说就是:该效果类似于iPhone中View的切换动画效果,今天就只介绍上面展示的效果. 废话不多说,先上效果,再看代码!! 效果一: 效果二: 效果三: 效果四:(犯错的效果): 效果五(回旋效果一): 效果六(回旋效果二): 效果看完了,就来看下上面效果实现的具体代码吧, 中间会把我自己试验的.犯的错误都以注释的形式写下来的, 大家使用的时候别出错就行了!先来看下