iOS动画实现总结
在iOS中,动画实现方向有两种,一种是操作UIView的animation方法,另外一种就是核心动画,但到iOS7中,UIView又跟核心动画牵扯在一起。
方式一(利用核心动画添加动画)
核心动画的层次关系

转场动画(CATransition)
- 用于做场景的转换动画,能偶为层提供移出屏幕和一如屏幕的动画效果。
- UINavigationController就是通过CATransition实现了讲控制器的师徒推入屏幕的动画效果。
- 常用属性
- type动画过度类型
- subtype:动画过度方向
- startProgress:动画起点(在整体的百分比)(可用的值从0到1,在动画中起点或终点的逗留时间,开始的时间一定要比结束的时间小,下同)
- endProgress:动画终点(在整体动画的百分比)
CATransition *animation = [CATransition animation];
animation.type = @"reveal";
animation.duration = ;
animation.subtype = kCATransitionReveal;
[self.myView.layer addAnimation:animation forKey:nil];
CGPoint point = self.myView.center;
point.y += ;
[self.myView setCenter:point];
基本动画(CABasicAnimation),是CAPropertyAnimation的子类,一个动画可控制一个属性的变化,变化值只能是两个值中变化,可以在fromValue和toValue两个值中设置
CABasicAnimation *baseAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
baseAnimation.fromValue = [NSValue valueWithCGRect:CGRectMake(, , , )];
baseAnimation.toValue = [NSValue valueWithCGRect:CGRectMake(, , , )]; baseAnimation.duration = 2.0;
baseAnimation.removedOnCompletion = NO;
baseAnimation.fillMode = kCAFillModeForwards;
baseAnimation.repeatCount = MAXFLOAT; [self.myView.layer addAnimation:baseAnimation forKey:nil];帧动画(CAKeyframeAnimation),帧动画也是CAPropertyAnimation的子类,所以也是控制一个view的属性做动画,与CABaseAnimation不同的是,CAKeyFrameAnimation可以添加多个关键帧,而CABaseAnimation可以看做是两个关键帧的帧动画,我们可以好好利用帧动画的关键帧来做比较有趣的动画,如泡泡效果。
CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
// 位移
CAKeyframeAnimation *positionAnima = [CAKeyframeAnimation animationWithKeyPath:@"position"];
positionAnima.calculationMode = kCAAnimationCubicPaced;
positionAnima.duration = 5;
positionAnima.fillMode = kCAFillModeForwards;
positionAnima.removedOnCompletion = NO;
positionAnima.repeatCount = MAXFLOAT;
positionAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; // 添加移动路径
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGRect circleContainer = CGRectInset(myView.frame, myView.frame.size.width / - , myView.frame.size.height / - );
CGPathAddEllipseInRect(curvedPath, NULL, circleContainer);
positionAnima.path = curvedPath;
CGPathRelease(curvedPath);
[myView.layer addAnimation:positionAnima forKey:nil]; // 缩放X
CAKeyframeAnimation *scaleX = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.x"];
scaleX.duration = 1.0;
scaleX.values = @[@1.0,@1.1,@1.0];
scaleX.keyTimes = @[@0.0,@0.5,@1.0];
scaleX.repeatCount = MAXFLOAT;
scaleX.autoreverses = YES; scaleX.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[myView.layer addAnimation:scaleX forKey:nil]; // 缩放Y
CAKeyframeAnimation *scaleY = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.y"];
scaleY.duration = 1.5;
scaleY.values = @[@1.0,@1.1,@1.0];
scaleY.keyTimes = @[@0.0,@0.5,@1.0];
scaleY.repeatCount = MAXFLOAT;
scaleY.autoreverses = YES; group.animations = @[positionAnima,scaleX,scaleY];
scaleY.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[myView.layer addAnimation:scaleY forKey:nil];
运行效果
由于本人的电脑是黑苹果,所以将就一下啦,哈哈,白苹果应该不会这样的。
- 动画组(CAAnimationGroup)CAAnimation的子类,可以保存一组动画对象,讲CAAnimationGroup对象加入层后,组中所有动画可以同时运行,所以,当我们需要做多个动画并且执行的时间不一样的时候,动画组就不适用。例如上面的泡泡效果。
group.animations = [里面放动画对象];
方式二(利用UIView添加动画)
- UIView动画(手码)
- 添加单个动画
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:];
CGPoint point = self.myView.center;
point.y += ;
[self.myView setCenter:point];
[UIView commitAnimations]; - 添加多个动画
- 添加单个动画
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:];
CGPoint point = self.myView.center;
point.y += ;
[self.myView setCenter:point];
[UIView commitAnimations]; [UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:];
[self.myView setAlpha:0.1];
[UIView commitAnimations];
- UIView动画(Block)
[UIView animateWithDuration: animations:^{
CGPoint point = self.myView.center;
point.y += ;
[self.myView setCenter:point];
}];
- UIView动画(Block帧动画),从iOS7开启,苹果提供了比较便捷的方法来调用帧动画,不用新建帧动画实例,直接对layer的属性进行控制。
[UIView animateKeyframesWithDuration:0.5 delay: options:UIViewKeyframeAnimationOptionAutoreverse animations:^{
self.view.bounds = CGRectMake(, , , );
} completion:^(BOOL finished) {
}];
- UIView转场动画。
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
这个方法应该不好理解,简单来说,这个方法调用完毕后,相当于执行了两句代码,
// 添加toView到父视图
[fromView.superview addSubview:toView];
// 把fromView从父视图中移除
[fromView.superview removeFromSuperview];
- duration:动画的持续时间
- duration:动画的持续时间
- options:转场动画的类型
- animations:将改变视图属性的代码放在这个block中
- completion:动画结束后,会自动调用这个block
iOS动画实现总结的更多相关文章
- (转)iOS动画Core Animation
文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...
- 解析 iOS 动画原理与实现
这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到 ...
- IOS动画隐式,显式,翻页
// ViewController.m // IOS动画0817 // // Created by 张艳锋 on 15/8/17. // Copyright (c) 2015年 张艳锋. Al ...
- iOS动画原理
1. iOS动画原理 本质:动画对象(这里是UIView)的状态,基于时间变化的反应 分类:可以分为显式动画(关键帧动画和逐帧动画)和隐式动画 关键帧和逐帧总结:关键帧动画的实现方式,只需要修改某个属 ...
- iOS 动画基础
原文:http://www.cnblogs.com/lujianwenance/p/5733846.html 今天说一下有关动画的基础,希望能帮助到一些刚接触iOS动画或者刚开始学习iOS的同学, ...
- ios 动画效果CATransition笔记
初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现i ...
- IOS动画总结
IOS动画总结 一.基本方式:使用UIView类的UIViewAnimation扩展 + (void)beginAnimations:(NSString *)animationID context ...
- ios 动画学习的套路 (二)
有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! (一) 说说这两个三方库 ...
- iOS动画学习-视觉效果
CALayer不仅仅是iOS动画学习-CALayer中介绍的那些内容,他还有一些其他属性,比如shadowColor,borderWidth,borderColor等等,这些属性我们只需要简单点设置就 ...
- iOS 动画篇 (二) CAShapeLayer与CoreAnimation结合使用
接上一篇博客 iOS 动画篇(一) Core Animation CAShapeLayer是CALayer的一个子类,使用这个类能够很轻易实现曲线的动画. 先来一个折线动画效果: 示例代码: //1. ...
随机推荐
- HeadFirst设计模式之模板方法模式
一. 1.The Template Method defines the steps of an algorithm and allows subclasses to provide the impl ...
- 退出myeclipse 8.5配置中心
用myeclipse 8.5没多久,进入软件中心下载插件,找不到退出按钮,唉,木想到就是一图标.
- Android开发经验记录
一. 代码规范 定一个规范的主要目的,是为了让不同的开发人员写的代码能保持一致性,方便别人看自己的代码.另外,对个人来说,也能起到让自己看着舒服的作用. 1. 基本 * 使用UTF-8 ...
- 在NPAPI开发火狐浏览器插件在NPAPI插件
1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...
- Android开发之使用AlertDialog创建对话框,单选框和多选框
对话框: 对话框的icon,title,message等都可以不设置. 单选框和多选框与对话框勾选步骤基本上一致. 对话框的构建步骤: 1.使用AlertDialog类的内部类Builder类new ...
- poj2352Stars
http://poj.org/problem?id=2352 二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 #include <iostream> #in ...
- [swustoj 327] 最小的最大与最大的最小
最小的最大与最大的最小(0327) Time limit(ms): 2500 Memory limit(kb): 65535 Submission: 329 Accepted: 18 问题描述 又 ...
- OK335xS LAN8710 phy driver hacking
/******************************************************************** * OK335xS LAN8710 phy driver h ...
- Java [leetcode 11] Container With Most Water
问题描述: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...
- 多线程程序设计学习(6)Producer-Consumer模式
Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...