CALayer, CoreGraphics与CABasicAnimation介绍

今天我们来看一下CALayer、CoreGraphics和CABasicAnimation。这些东西在处理界面绘制、动画效果上非常有用。

本篇博文就讲介绍CALayer的基本概念,使用CoreGraphics自定义绘制,以及基于CABasicAnimation的动画。以下内容都假定您有一定的Object-C基础,也熟悉UIView等相关的操作。如果不熟的话,您还要自行查阅资料。这里就不多讲了。

要使用CALayer,首先要添加QuartzCore框架。然后在你的Controller里添加包含该框架的头文件

#import <QuartzCore/QuartzCore.h>

在Controller的实现中添加viewDidAppear:方法。

每个view都有layer对象。可以通过view的layer属性访问。也可以创建一个layer对象:

CALayer *layer = [CALayer layer];

默认的,layer的frame是CGRectZero。虽然默认的添加了之后(addSublayer)看不见,但是layer已经存在了。为了让这个layer现实出来,修改一下这些可视属性。

layer.frame = CGRectMake(100, 100, 100, 100);
layer.backgroundColor = [UIColor orangeColor].CGColor;

这里layer接受的是color的CGColor属性值。添加到controller的view.layer的子layer中:

[self.view.layer addSublayer:layer];

运行起来项目,就可以看到这个orange色的一片。那就是你刚刚添加的layer。

现在开始研究自定义绘制。开始在layer上绘制之前需要给layer设置代理

[layer setDelegate:self];

注意:layer的代理如果是Controller的话,没有什么问题。如果是CAlayer或者UIView及其子类的话就会出问题。当自定义绘制时,会调用这个方法

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    NSLog(@"layer custom draw");
}

但是运行项目你会发现这个方法不会自动被调用,在Console里不会打印出“layer custom draw”。很有意思啊,这是为什么呢?这是因为我们需要自己调用触发layer绘制的方法。很简单!咱们已经设定好了代理,那么只需要调用这个方法

[layer setNeedsDisplay];

那么这时你再运行起来项目看看,Console就会打印出“layer custom draw”这个字符串了。

把下面的代码复制到你的绘制方法里。看看CoreGraphics是如何起作用的。

大家可以看到一条黑线,额,黑线,贯穿layer。

这个layer看起来太方了,来个圆角是不是更好。再加个边条,加个阴影。

    layer.cornerRadius = 20;
    layer.borderColor = [UIColor yellowColor].CGColor;
    layer.borderWidth = 5;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.shadowOffset = CGSizeMake(10, 10);
    layer.shadowOpacity = .8f;

下面来看看CABasicAnimation。

在viewDidAppear方法中,添加完layer之后添加动画的代码:

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
[animation setDuration:1.0];
[animation setRepeatCount:INT_MAX];
[animation setFromValue:[NSNumber numberWithFloat:0.0]];
[animation setToValue:[NSNumber numberWithFloat:1.0]];
[layer addAnimation:animation forKey:nil];

跑起来看看,对于layer透明度动画在视图加载完之后动画开始重复播放1000次。

全部代码(略有更改)

 1 #import "ADImplicitViewController.h"
 2 #import <QuartzCore/QuartzCore.h>
 3
 4 @interface ADImplicitViewController ()
 5 @property (nonatomic, weak) CALayer *animLayer;
 6 @end
 7
 8 @implementation ADImplicitViewController
 9
10 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
11 {
12     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
13     if (self) {
14         // Custom initialization
15     }
16     return self;
17 }
18
19 - (void)viewDidLoad
20 {
21     [super viewDidLoad];
22     // Do any additional setup after loading the view.
23 }
24
25 - (void)viewDidAppear:(BOOL)animated{
26     [super viewDidAppear: animated];
27     self.view.backgroundColor = [UIColor whiteColor];
28
29     CALayer *layer = [CALayer layer];
30     layer.frame = CGRectMake(100, 100, 100, 100);
31     layer.backgroundColor = [UIColor orangeColor].CGColor;
32     _animLayer = layer;
33     [layer setDelegate:self];
34
35     [self.view.layer addSublayer:layer];
36
37 //    [layer setNeedsDisplay];
38
39     layer.cornerRadius = 20;
40     layer.borderColor = [UIColor yellowColor].CGColor;
41     layer.borderWidth = 5;
42     layer.shadowColor = [UIColor blackColor].CGColor;
43     layer.shadowOffset = CGSizeMake(10, 10);
44     layer.shadowOpacity = .8f;
45
46     CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
47     [animation setDuration:1.0];
48     [animation setRepeatCount:1000];
49     [animation setFromValue:[NSNumber numberWithFloat:0.0]];
50     [animation setToValue:[NSNumber numberWithFloat:1.0]];
51     [layer addAnimation:animation forKey:nil];
52 }
53
54 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
55     NSLog(@"layer custom draw");
56
57 //    CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);
58 //    CGContextSetLineWidth(ctx, 5);
59 //
60 //    CGContextMoveToPoint(ctx, 5, 5);
61 //    CGContextAddLineToPoint(ctx, 95, 95);
62 //
63 //    CGContextStrokePath(ctx);
64 }
65
66 - (void)didReceiveMemoryWarning
67 {
68     [super didReceiveMemoryWarning];
69     // Dispose of any resources that can be recreated.
70 }
71
72 - (IBAction)startAction:(id)sender {
73
74     _animLayer.backgroundColor = [UIColor redColor].CGColor;
75 }
76
77 @end

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/3412532.html

时间: 2024-08-07 22:23:18

CALayer, CoreGraphics与CABasicAnimation介绍的相关文章

iOS动画:UIView动画和CALayer动画(CABasicAnimation、CAKeyframeAnimation的使用)

iOS中的动画有两种实现方式,一种是UIView来实现动画,另一种动画是通过CALayer来实现,下面介绍两种动画的简单实现: 一.UIView动画的实现    UIView使用Context来实现动画 关键代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 //参数1 动画名称 参数2 要实现动画的对象上下文           [UIView beginAnimations:

ios应用相关的性能优化及参考文档

ios app programming guide:  https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/Introduction/Introduction.html http://www.cocoachina.com/newbie/tutorial/2013/0412/5980.html   中级 http://www.cocoachina.com/n

CALayer动画的暂停,恢复,以及结束时候的回调

CALayer动画的暂停,恢复,以及结束时候的回调 源码如下: // // ViewController.m // AnimationLineView // // Created by YouXianMing on 14/11/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "YXGCD.h" @interface Vi

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.       下载:https://github.com/mwaterfall/MWPhotoBrowser   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Gith

POP介绍与使用实践(快速上手动画)[转]

前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器) 介绍 官方地址 https://githu

iOS开发之CALayer

1.概述 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层: ? 1 @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需要显示到屏幕上时,会

iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客

第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graphics 和Quartz 2D的区别 quartz是一个通用的术语,用于描述在IOS和MAC OS X ZHONG 整个媒体层用到的多种技术 包括图形.动画.音频.适配. Quart 2D 是一组二位绘图和渲染API,Core Graphic会使用到这组API Quartz Core 专指Core Animation用到的动画相关的库.API和类 点和像素的对比 系统拥有坐标系,如3

暂停、恢复CALayer 动画

CALayer都是实现了CAMediaTiming协议(或者叫做接口).所以layer的动画有一个很有意思的属性speed.如果一个layer的动画速度变成0.0的时候,很显然这个动画就不再动了.设置layer的speed为0时,layer的动画暂停.speed属性设置为任意大于0的值时,动画回复. 要暂停一个动画时: -(void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurr

CALayer(持续更新)

CALayer The CALayer class manages image-based content and allows you to perform animations on that content. Layers are often used to provide the backing store for views but can also be used without a view to display content. A layer's main job is to