核心动画——CAAnimation

核心动画——CAAnimation

需要的框架:CoreAnimation   ->  基础框架

CAAnimation 分为三大类:     处理动画的类 (基类 不能使用)

①CAPropertyAnimation         属性动画 -> 通过改变属性值产生动画效果

  <1>CABasicAnimation        基础动画 -> 只能是两个点之间的变化

       CASpringAnimation      弹簧动画 (弹动效果)

  <2>CAKeyframeAnimation     关键帧动画 -> 可以添加多个点的变化或者添加路径

②CAAnimationGroup            动画组 -> 可以同时添加多种动画  达到预期效果

③CATransition                转场动画 -> 给视图切换的时候添加动画效

下面给大家画一个结构图,可以让大家更容易的了解

CALayer 图层

UIView 视图 -> 可以跟用户交互 -> rootLayer 发生改变子图层也会发生改变 rootLayer没有动画效果

button 不止有一个视图 改变的只是其中一个视图的rootLayer -> 显示 未被裁切的边框

CALayer -> 不可以跟用户交互 只能显示内容 发生改变子图层不会跟随发生改变 本身自带动画效果(改变属性效果的时候) -> 隐式动画

CALayer可以设置的属性

bounds 边境范围

position 中心点

zPosition z轴中心点

anchorPoint 锚点  

anchorPointZ Z轴锚点

transform 转换形态

frame NO. Animatable 坐标

hidden 隐藏

doubleSided 图层背面是否显示

geometryFlipped 翻转 颠倒

masksToBounds 裁切边境

contents 内容

opaque 不透明度

allowsEdgeAntialiasing 是否使用 变形后的抗锯齿

backgroundColor 背景颜色

borderWidth 边框宽

borderColor 边框颜色

opacity 不透明度

shadowColor 阴影颜色

shadowOpacity 阴影不透明度

rasterizationScale 防止Retina屏幕像素化

shadowOffset 阴影偏移量

shadowRadius 阴影的半径

?????锚点的最大值是1,1 最小值是0,0 默认值是0.5,0.5当视图改变的时候是以锚点为基点去改变的

    锚点的值与位置

    0,0 = 在图层的左上角

    0,1 = 图层的左下角

    1,0 = 图层的右上角

    1,1 = 在图层的右下角

锚点的计算公式:锚点值 = 锚点在视图上的位置.x.y/视图的宽高

下面就钟表为例介绍一下核心动画:

#import "ViewController.h"

#define Angle(a) (a)*M_PI/180
#define SAngle 6 //每秒旋转多少度

@interface ViewController ()
{
    CALayer *layer;
    float s;
}

@property(nonatomic,strong)CALayer *pointLayer;
@property(nonatomic,strong)CALayer *minuteLayer;
@property(nonatomic,strong)CALayer *SecondtLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //**图层不能跟用户交互,不能添加响应事件
    //初始化CALayer  addSubLayer:添加到父图层的方法
    /*
    layer = [CALayer layer];
    layer.frame = CGRectMake(0, 0, 100, 100);
    layer.cornerRadius = 50;
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    [self.view.layer addSublayer:layer];
    */

    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.width)];
    image.image = [UIImage imageNamed:@"biaopan"];
    image.contentMode = UIViewContentModeScaleAspectFit;
    image.center = self.view.center;
    [self.view addSubview:image];

    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;

    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;

    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    //图层上要的是颜色CGColorRef 图片CGImageRef
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(start) userInfo:nil repeats:YES];
}

- (void)start{

    //日历的一个类NSCalendar 获得年月日时分秒
    //NSDateComponents 组件

    NSCalendar *calendar = [NSCalendar currentCalendar];
    ///(NSCalendarUnit)需要的组件  获得哪个日期的组件
    NSDateComponents *component = [calendar components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:[NSDate date]];

    s = component.second*SAngle;
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(s),0, 0, 1);
    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;

    float m = component.minute*SAngle;
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(m),0, 0, 1);
    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;

    float h = component.hour*SAngle;
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(h), 0, 0, 1);
    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
}

- (CALayer *)pointLayer{
    if (_pointLayer) {
        return _pointLayer;
    }
    _pointLayer = [CALayer layer];
    _pointLayer.bounds = CGRectMake(0, 0, 29, 200);
    _pointLayer.position = self.view.center;
    [self.view.layer addSublayer:_pointLayer];
    return _pointLayer;
}

- (CALayer *)minuteLayer{
    if (_minuteLayer) {
        return _minuteLayer;
    }
    _minuteLayer = [CALayer layer];
    _minuteLayer.bounds = CGRectMake(0, 0, 21, 210);
    _minuteLayer.position = self.view.center;
    [self.view.layer addSublayer:_minuteLayer];
    return _minuteLayer;
}

- (CALayer *)SecondtLayer{
    if (_SecondtLayer) {
        return _SecondtLayer;
    }
    _SecondtLayer = [CALayer layer];
    _SecondtLayer.bounds = CGRectMake(0, 0, 21, 230);
    _SecondtLayer.position = self.view.center;
    [self.view.layer addSublayer:_SecondtLayer];
    return _SecondtLayer;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    /*
    UITouch *touch = [touches anyObject];
    layer.position = [touch locationInView:self.view];
    CGFloat width = CGRectGetWidth(layer.bounds)!= 100?100:25;
    layer.bounds = CGRectMake(0, 0, width, width);

    CGColorRef color = [UIColor lightGrayColor].CGColor != layer.backgroundColor?[UIColor lightGrayColor].CGColor:[UIColor yellowColor].CGColor;
    layer.backgroundColor = color;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.geometryFlipped = YES;
    layer.cornerRadius = layer.cornerRadius != 50?50:0;
    //图层的透明度
    layer.opacity = 0;
    */

    //緢点
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(Angle(60)), 0, 0, 1);
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(s/60), 0, 0, 1);
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(s/360), 0, 0, 1);

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //layer.opacity = 1;
    self.pointLayer.transform = CATransform3DIdentity;

}

@end

效果如下:

时间: 2024-08-07 21:21:05

核心动画——CAAnimation的相关文章

核心动画 CAAnimation 进阶

转载自:http://www.cofcool.net/development/2015/06/20/ios-study-note-nine-CoreAnimation/ Core Animation,即为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core Animation可以用在Mac OS X和iOS平台.Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程.要注意的

iOS 核心动画CAAnimation介绍

CAAnimation 的继承结构 CAAnimation是所有动画的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,要使用它的字类 1.duration:动画持续的时间 2.repeatCount:动画重复的此时,无限循环可以设置成HUGE_VALF或MAXFLOAT 3.repeatDuriation:重复时间 4.removedOnCompletion:默认为YES,代表动画完毕后就从图层上移除,图层会恢复到动画执行前的状态,如果想要动画保持结束后的状态,就将该属性设为NO,

iOS:核心动画的详解介绍:CAAnimation(抽象类)及其子类

核心动画的详解介绍:CAAnimation(抽象类) 1.核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h> ,在iOS7中不需要 2.动画分类 基本动画    CABasicAnimation 关键帧动画  CAKeyframeAnimation 动画组     CAAnimationGro

IOS-CoreAnimation(核心动画)

一.核心动画 1.Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h> 2.开发步骤: ①初始化一个动画对象(CAAnimation)并设置一些动画相关属性 ②添加动画对象到层(CALayer)中,开始执行动画 3.CALayer中很多属性都可以通过CAAnimation实现动画效果,包括:opacity.posi

iOS核心动画Core Animation(二)

一. 使用核心动画实现动画效果的步骤 ■1. 创建动画对象 ■2. 设置动画属性 ■3. 把动画对象添加到某个 CALayer 对象上 ■4. 需要停止动画:可以调用 remove 方法移除动画 具体步骤 1.使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h> 2.初始化一个CAAnimation对象,并设置一些动画相关属性 3.通过调用CALayer的addAnimation:forKey:方法增加CAAnimatio

iOS核心动画Core Animation(一)

核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程. 二.核心动画常识 列举处核心动画的一些常识知识. 核心动画的本质:在后台移动图层中的内容,  执行完毕后图层本身的位置并没有发生变化. 如果是Xcode6之前的版本,要导入<QuartzCore/QuartzCore.h>框架,

iOS:核心动画之动画组CAAnimationGroup

CAAnimationGroup——动画组 动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行 属性说明: –animations:用来保存一组动画对象的NSArray 默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间 具体的实例如下: 实现功能:在创建的动画组中存入两个基本动画,一个是沿着Z轴旋转360度的动画,另一个是放大2倍的动画,这两个动画并

iOS:核心动画之关键帧动画CAKeyframeAnimation

CAKeyframeAnimation——关键帧动画 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是: –CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值 – 属性说明: –values:上述的NSArray对象.里面的元素称为“关键帧”(keyframe).动画对象会在指定的时间(duration)内,依次显

iOS:核心动画具体的类和协议的介绍

核心动画类:CAAnimation.CAPropertyAnimation.CABasicAnimation.CAKeyframeAnimation.CATransition.CAAnimationGroup 父类:CAAnimation(抽象类) CAAnimation直接子类:CAPropertyAnimation(抽象类),CATransition(转场动画),CAAnimationGroup(动画数组) CAPropertyAnimation直接子类:CABasicAnimation(基