Core Animation 动画的使用:关键帧动画、基础动画、动画组

效果如下:

ViewController.h

1 #import <UIKit/UIKit.h>
2
3 @interface ViewController : UIViewController
4 @property (strong, nonatomic) IBOutlet UIImageView *imgVAnimation;
5 @property (strong, nonatomic) IBOutlet UIButton *btnAnimation1;
6 @property (strong, nonatomic) IBOutlet UIButton *btnAnimation2;
7
8 @end

ViewController.m

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4 - (void)modifyLayerForButton:(UIButton *)btn;
  5 - (void)layoutUI;
  6 @end
  7
  8 @implementation ViewController
  9 #define kCornerRadiusOfImage CGRectGetWidth(_imgVAnimation.frame)/2.0
 10
 11 - (void)viewDidLoad {
 12     [super viewDidLoad];
 13
 14     [self layoutUI];
 15 }
 16
 17 - (void)didReceiveMemoryWarning {
 18     [super didReceiveMemoryWarning];
 19     // Dispose of any resources that can be recreated.
 20 }
 21
 22 - (void)modifyLayerForButton:(UIButton *)btn {
 23     btn.layer.masksToBounds = YES;
 24     btn.layer.cornerRadius = 5.0;
 25     btn.layer.borderColor = [UIColor grayColor].CGColor;
 26     btn.layer.borderWidth = 1.0;
 27 }
 28
 29 - (void)layoutUI {
 30     //图片视图
 31     _imgVAnimation.layer.masksToBounds = YES;
 32     _imgVAnimation.layer.cornerRadius = kCornerRadiusOfImage;
 33     _imgVAnimation.layer.borderColor = [UIColor orangeColor].CGColor;
 34     _imgVAnimation.layer.borderWidth = 2.0;
 35
 36     //按钮
 37     [self modifyLayerForButton:_btnAnimation1];
 38     [self modifyLayerForButton:_btnAnimation2];
 39 }
 40
 41 - (IBAction)btnAnimation1DidPush:(id)sender {
 42     //移到右下角;使用关键帧动画,移动路径为预定的贝塞尔曲线路径
 43     CGPoint fromPoint = _imgVAnimation.center;
 44     CGFloat toPointX = self.view.frame.size.width - kCornerRadiusOfImage;
 45     CGFloat toPointY = self.view.frame.size.height - kCornerRadiusOfImage;
 46     CGPoint toPoint = CGPointMake(toPointX, toPointY);
 47     CGPoint controlPoint = CGPointMake(toPointX, 0.0);
 48
 49     UIBezierPath *path = [UIBezierPath bezierPath];
 50     [path moveToPoint:fromPoint];
 51     [path addQuadCurveToPoint:toPoint controlPoint:controlPoint];
 52
 53     CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
 54     positionAnimation.path = path.CGPath;
 55     positionAnimation.removedOnCompletion = YES;
 56
 57     //变小;使用基础动画
 58     CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
 59     transformAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
 60     transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; //设置 X 轴和 Y 轴缩放比例都为1.0,而 Z 轴不变
 61     transformAnimation.removedOnCompletion = YES;
 62
 63     //透明;使用基础动画
 64     CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
 65     opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0];
 66     opacityAnimation.toValue = [NSNumber numberWithFloat:0.1];
 67     opacityAnimation.removedOnCompletion = YES;
 68
 69     //组合效果;使用动画组
 70     CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
 71     animationGroup.animations = @[ positionAnimation, transformAnimation, opacityAnimation ];
 72     animationGroup.duration = 1.0; //设置动画执行时间;这里设置为1.0秒
 73     animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; //设置媒体调速运动;默认为 kCAMediaTimingFunctionLinear,即为线型间隔;这里设置为 kCAMediaTimingFunctionEaseIn,即先慢后快,相当于有个加速度
 74     animationGroup.autoreverses = YES; //设置自动倒退,即动画回放;默认值为NO
 75     [_imgVAnimation.layer addAnimation:animationGroup forKey:nil];
 76 }
 77
 78 - (IBAction)btnAnimation2DidPush:(id)sender {
 79     //向右移动;使用关键帧动画,移动路径为预定的直线路径
 80     CGPoint fromPoint = _imgVAnimation.center;
 81     CGPoint toPoint = CGPointMake(fromPoint.x + 100.0, fromPoint.y);
 82
 83     UIBezierPath *path = [UIBezierPath bezierPath];
 84     [path moveToPoint:fromPoint];
 85     [path addLineToPoint:toPoint];
 86
 87     CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
 88     positionAnimation.path = path.CGPath;
 89     positionAnimation.removedOnCompletion = YES;
 90
 91     //旋转;使用基础动画
 92     CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
 93     transformAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
 94     transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0)]; //设置沿着 Z 轴顺时针旋转90度;注意 CATransform3DMakeRotation 总是按最短路径来选择,当顺时针和逆时针的路径相同时(e.g. M_PI),会使用逆时针
 95     transformAnimation.repeatCount = 8.0; //设置动画播放重复次数;这里设置为8.0次,共720度
 96     transformAnimation.duration = 0.5; //设置动画执行时间;这里设置为0.5秒
 97     transformAnimation.cumulative = YES; //设置是否累积;默认值为NO,这里设置为YES,看起来才动画效果连贯
 98     transformAnimation.removedOnCompletion = YES;
 99
100     //组合效果;使用动画组
101     CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
102     animationGroup.animations = @[ positionAnimation, transformAnimation ];
103     animationGroup.duration = 4.0; //设置动画执行时间;这里设置为4.0秒
104     animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; //设置媒体调速运动;默认为 kCAMediaTimingFunctionLinear,即为线型间隔;这里设置为 kCAMediaTimingFunctionEaseIn,即先慢后快,相当于有个加速度
105     animationGroup.autoreverses = YES; //设置自动倒退,即动画回放;默认值为NO
106
107     //以下两句是『动画结束后回到初始状态的现象』的解决方法;这里没用到
108     //animationGroup.removedOnCompletion = NO; //设置是否完成后从对应的所属图层移除他,默认为YES
109     //animationGroup.fillMode = kCAFillModeForwards; //设置动画填充模式;默认值为 kCAFillModeRemoved,即动画执行完就移除,变回原来的状态,这里设置为 kCAFillModeForwards,即保持向前的状态
110     [_imgVAnimation.layer addAnimation:animationGroup forKey:nil];
111 }
112
113 @end

Main.storyboard

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
 3     <dependencies>
 4         <deployment identifier="iOS"/>
 5         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
 6     </dependencies>
 7     <scenes>
 8         <!--View Controller-->
 9         <scene sceneID="ufC-wZ-h7g">
10             <objects>
11                 <viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController">
12                     <layoutGuides>
13                         <viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
14                         <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
15                     </layoutGuides>
16                     <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
17                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
18                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
19                         <subviews>
20                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Emoticon_tusiji_icon2" translatesAutoresizingMaskIntoConstraints="NO" id="j2r-O5-Hj2">
21                                 <rect key="frame" x="20" y="40" width="150" height="150"/>
22                             </imageView>
23                             <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aiO-kP-xCF">
24                                 <rect key="frame" x="20" y="243" width="150" height="50"/>
25                                 <state key="normal" title="移到右下角变小透明">
26                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
27                                 </state>
28                                 <connections>
29                                     <action selector="btnAnimation1DidPush:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="7Z2-yc-1vS"/>
30                                 </connections>
31                             </button>
32                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="图片操作:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YH5-Oi-KEH">
33                                 <rect key="frame" x="20" y="208" width="150" height="21"/>
34                                 <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
35                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
36                                 <nil key="highlightedColor"/>
37                             </label>
38                             <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hSL-o5-Ism">
39                                 <rect key="frame" x="20" y="311" width="150" height="50"/>
40                                 <state key="normal" title="旋转并向右移动">
41                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
42                                 </state>
43                                 <connections>
44                                     <action selector="btnAnimation2DidPush:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="lC4-zx-uIb"/>
45                                 </connections>
46                             </button>
47                         </subviews>
48                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
49                     </view>
50                     <connections>
51                         <outlet property="btnAnimation1" destination="aiO-kP-xCF" id="kSp-82-S2R"/>
52                         <outlet property="btnAnimation2" destination="hSL-o5-Ism" id="6Mz-Wd-xfN"/>
53                         <outlet property="imgVAnimation" destination="j2r-O5-Hj2" id="Gmp-iW-kaX"/>
54                     </connections>
55                 </viewController>
56                 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
57             </objects>
58         </scene>
59     </scenes>
60     <resources>
61         <image name="Emoticon_tusiji_icon2" width="150" height="150"/>
62     </resources>
63 </document>
时间: 2024-12-28 01:41:22

Core Animation 动画的使用:关键帧动画、基础动画、动画组的相关文章

iOS Core Animation Advanced Techniques(六): 基于定时器的动画和性能调优

基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟 物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画. 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显

Core Animation 文档翻译 (第八篇)—提高动画的性能

前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评估和跟踪APP的性能,以至于我们能够确保性能是提升而不是退化的. ? 综合的建议和技巧 有以下几种方式能让我们的Layers更有效的实现效果.对于任何优化来说,我们应该在尝试优化前先测量当前代码的性能:根据未优化之前的性能检测结果,能够让我们知道所做的优化是否提升了性能. ? 尽可能的使用不透明的L

动画基础--基于Core Animation(1)

1.简介 上一篇文章[New learn]动画-基于UIView了解到了一些直接由UIView这个在UIKIT提供的类中提供的一些动画方法. 使用UIView的动画特性已经能够满足我们很多的需求,它是对于Core Animation的底层方法做了了高级抽象,使得我们开发动画更加便捷,但是便捷的另外一边就失去了Core Animation框架的 完整性和灵活性.当然除了这些UIView还提供了很多用户交互上的功能如相应用户点击等. 那么我们什么时候回正真要去操作更加底层的Core Animatio

iOS Core Animation Advanced Techniques(四):隐式动画和显式动画

隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第一部分讨论了Core Animation除了动画之外可以做到的任何事情.但是动画师Core Animation库一个非常显著的特性.这一章我们来看看它是怎么做到的.具体来说,我们先来讨论框架自动完成的隐式动画(除非你明确禁用了这个功能). 事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在.

简析iOS动画原理及实现——Core Animation

本文转载至 http://www.tuicool.com/articles/e2qaYjA 原文  https://tech.imdada.cn/2016/06/21/ios-core-animation/ 主题 Core Animation 背景 随着达达业务的扩大,越来越多的人开始使用达达客户端,参加到众包物流的行业中.达达客户端分为iOS平台和安卓平台. APP开发也从快速迭代的粗旷性开发转向高可复用,提升用户提现的精细化方向发展.iOS动画交互良好,使用广泛,良好的用户体验离不开流畅的界

Core Animation学习总结

目录: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effects(视觉效果) Transforms(变换) Specialized Layers(专有图层) Setting Things in Motion Implicit Animations(隐式动画) Explicit Animations(显式动画) Layer Time(图层时间) Easing(缓

Core Animation高级理论知识汇总

一. 基本概念 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只是Core Animation特性的冰山一角.Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中.于是这个树形成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础.和UIView最大的不同

iOS——Core Animation 知识摘抄(四)

原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的时间.解码后的图片将同样使用相当大的内存. 用于加载的CPU时间相对于解码来说根据图片格式而不同.对于PNG图片来说,加载会比JPEG更长,因为文件可能更大,但是解码会相对较快,而且Xcode会把PNG图片进行解码优化之后引入工程.JPEG图片更小,加载更快,但是解压的步骤要消耗更长的时间,因为JP

iOS Core Animation之CALayer心得

使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的API是较高级的封装,使用便捷,使得我们免于自己使用OpenGL实现动画.本文主要介绍如何使用CALayer的mask实现一个双向注水动画(姑且这么叫吧). 了解CALayer的mask 以上是CALayer的头文件关于mask的说明,mask实际上layer内容的一个遮罩. 如果我们把mask是透明的

动画基础--基于Core Animation(2)

参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本片文章将继续探讨更加深入的动画知识. 6.视觉效果 圆角 圆角设定可以让原本死板的直角视图更加美观和谐:> -(void)radiusView { radiusView = [[UIView alloc]initWithFrame:CGRectMake(100.0f, 50.0f, 100.0f,