在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动画实现总结的更多相关文章

  1. (转)iOS动画Core Animation

    文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...

  2. 解析 iOS 动画原理与实现

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到 ...

  3. IOS动画隐式,显式,翻页

    //  ViewController.m //  IOS动画0817 // //  Created by 张艳锋 on 15/8/17. //  Copyright (c) 2015年 张艳锋. Al ...

  4. iOS动画原理

    1. iOS动画原理 本质:动画对象(这里是UIView)的状态,基于时间变化的反应 分类:可以分为显式动画(关键帧动画和逐帧动画)和隐式动画 关键帧和逐帧总结:关键帧动画的实现方式,只需要修改某个属 ...

  5. iOS 动画基础

    原文:http://www.cnblogs.com/lujianwenance/p/5733846.html   今天说一下有关动画的基础,希望能帮助到一些刚接触iOS动画或者刚开始学习iOS的同学, ...

  6. ios 动画效果CATransition笔记

    初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现i ...

  7. IOS动画总结

    IOS动画总结   一.基本方式:使用UIView类的UIViewAnimation扩展 + (void)beginAnimations:(NSString *)animationID context ...

  8. ios 动画学习的套路 (二)

    有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! (一) 说说这两个三方库 ...

  9. iOS动画学习-视觉效果

    CALayer不仅仅是iOS动画学习-CALayer中介绍的那些内容,他还有一些其他属性,比如shadowColor,borderWidth,borderColor等等,这些属性我们只需要简单点设置就 ...

  10. iOS 动画篇 (二) CAShapeLayer与CoreAnimation结合使用

    接上一篇博客 iOS 动画篇(一) Core Animation CAShapeLayer是CALayer的一个子类,使用这个类能够很轻易实现曲线的动画. 先来一个折线动画效果: 示例代码: //1. ...

随机推荐

  1. HeadFirst设计模式之模板方法模式

    一. 1.The Template Method defines the steps of an algorithm and allows subclasses to provide the impl ...

  2. 退出myeclipse 8.5配置中心

    用myeclipse 8.5没多久,进入软件中心下载插件,找不到退出按钮,唉,木想到就是一图标.

  3. Android开发经验记录

    一.    代码规范 定一个规范的主要目的,是为了让不同的开发人员写的代码能保持一致性,方便别人看自己的代码.另外,对个人来说,也能起到让自己看着舒服的作用. 1.      基本 * 使用UTF-8 ...

  4. 在NPAPI开发火狐浏览器插件在NPAPI插件

    1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...

  5. Android开发之使用AlertDialog创建对话框,单选框和多选框

    对话框: 对话框的icon,title,message等都可以不设置. 单选框和多选框与对话框勾选步骤基本上一致. 对话框的构建步骤: 1.使用AlertDialog类的内部类Builder类new ...

  6. poj2352Stars

    http://poj.org/problem?id=2352 二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 #include <iostream> #in ...

  7. [swustoj 327] 最小的最大与最大的最小

    最小的最大与最大的最小(0327) Time limit(ms): 2500 Memory limit(kb): 65535 Submission: 329 Accepted: 18   问题描述 又 ...

  8. OK335xS LAN8710 phy driver hacking

    /******************************************************************** * OK335xS LAN8710 phy driver h ...

  9. Java [leetcode 11] Container With Most Water

    问题描述: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...

  10. 多线程程序设计学习(6)Producer-Consumer模式

    Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...