概述

上篇博文讲述,UIView中封装了很多系统方法,可以满足我们的大部分需求。但是,其也有很多限制。那些方法产生的动画基本单元为UIView,是非常重量级的对象,而且也不支持三维布局,大部分是对视图的属性修改,和进行二维的仿射变换,若果想让动画效果更加炫酷,则需要使用Core Animation核心动画。

Core Animation最重要的就是CALayer(图层),图层的结构类似于UIView,每个UIView对象是由许多CALayer构成,他们负责不同的事务,构成了一个树级结构,如下图所示,图层树中负责着不同事务,一般的说法分为逻辑树,动画树,显示树,这个苹果官方文档中的介绍说可见图层一般分为图像树和渲染树。每个UIView也有一个主layer,可以通过view.layer获取。


图层的属性





主要几何属性如上图所示,大部分都很好理解,稍微解释下锚点:

锚点,就是图层挂在平面上的位置,从图层的原点到终点范围为(0.0, 0.0)到(1.0, 1.0)。既然是挂在平面上的位置,所以也就是position设在什么位置图层的锚点就挂在哪里。同样,旋转,缩放等也会围绕锚点进行。


简单的设置一些常用属性:

    _demoView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 50, 50)];
_demoView.layer.cornerRadius = 5.0f;//圆角
_demoView.layer.backgroundColor = [UIColor orangeColor].CGColor;
_demoView.layer.shadowOffset = CGSizeMake(2, 2);//阴影设置
_demoView.layer.shadowColor = [UIColor brownColor].CGColor;
_demoView.layer.shadowOpacity = 1.0f;
[self.view addSubview:_demoView]; _demoView.layer.anchorPoint = CGPointMake(0.5, 0.0);

效果

图层绘制与移动


setNeedsDisplay 将layer标记为需要重绘的。通过相应的步骤来更新contents
drawInContext: 压入一个上下文,并进行重绘
drawLayer:inContext: 给调用的layer进行重绘,也需要压入一个上下文进行绘制

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
UIGraphicsPushContext(ctx); [[UIColor orangeColor] set];
UIRectFill(layer.bounds); [[UIColor blackColor] set];
UIFont *font = [UIFont systemFontOfSize:48.0f];
[@"Pushing The Limits" drawInRect:layer.bounds
withFont:font
lineBreakMode:NSLineBreakByWordWrapping
alignment:NSTextAlignmentCenter]; UIGraphicsPopContext();
}

才调用时,一定要使用setNeedsDisplay来标记layer,不然其一定不会绘制。

效果







图层也和UIView一样,可以通过修改属性来移动。

- (void)viewDidLoad
{
[super viewDidLoad]; CALayer *myLayer = [CALayer layer];
myLayer.backgroundColor = [UIColor redColor].CGColor;
myLayer.frame = CGRectMake(100, 100, 50, 50);
[self.view.layer addSublayer:myLayer]; UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 50, 50)];
myView.backgroundColor = [UIColor blueColor];
[self.view addSubview:myView]; [self performSelector:@selector(moveLayerAndView) withObject:nil afterDelay:3.0f];
} - (void)moveLayerAndView
{
CALayer *layer = self.view.layer.sublayers[0];
layer.position = CGPointMake(100, 350); UIView *view = self.view.subviews[0];
view.center = CGPointMake(200, 350);
}

运行后可以发现图层不是直接移动,大概有0.3秒左右的移动动画效果,如果想禁用该动作可以在moveLayerAndView里面加入[CATransaction setDisableActions:YES];



最后推荐一个开发者开发的开源插件VVDocument,生成注释与文档很好用点击打开链接




以上为本篇博客全部内容,欢迎指正和交流。转载注明出处~

CoreAnimation —— CALayer的更多相关文章

  1. CoreAnimation (CALayer 动画)

    CoreAnimation基本介绍: CoreAnimation动画位于iOS框架的Media层 CoreAnimation动画实现需要添加QuartzCore.Framework CoreAnima ...

  2. iOS之CALayer属性简介

    /* CoreAnimation - CALayer.h Copyright (c) 2006-2017, Apple Inc. All rights reserved. */ #import < ...

  3. IOS QuartzCore核心动画框架

    IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...

  4. 【iOS】用Layer创建一个三维模型以及拖动

    关于CALayer的介绍以及基本属性,在这篇博客中有交代:CoreAnimation —— CALayer 这篇博客讲述简单的通过对layer的transform属性的设置一个CATransform3 ...

  5. iOS开发CoreAnimation解读之二——对CALayer的分析

    iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CALayer属性 1.Layer专门负责view的视图渲染 2.自定义view默认layer属性的类 二. ...

  6. CoreAnimation动画(CALayer动画)

    #pragma mark - CABasicAnimation动画 - (IBAction)basicAnimation:(UIButton *)sender { // 1.创建动画对象 CABasi ...

  7. CALayer基本介绍与常见属性

    属性框架:QuartzCore CA: CoreAnimation -> 核心动画,所有的核心动画都是添加给layer的! 与UIView的区别: 1.layer负责内容的展示,不接受任何用户交 ...

  8. iOS CoreAnimation详解(一) 有关Layer的动画

    以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...

  9. iOS CALayer应用详解(2)

    参考博客:http://blog.csdn.net/hello_hwc?viewmode=list 如果你对CALayer 还没有一个清晰的理解,欢迎看一下前面的博客: http://www.cnbl ...

随机推荐

  1. css3选择器的比较(二) -- 包含字符串

    二.  包含“字符串” 两种用法的区别是: a. “~=”,需要用空格分割, b. "*=",不需要任何分隔符 1. 资料 a) b)  2. html代码 <div tit ...

  2. iOS:原生二维码扫描

    做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...

  3. Objective-c 中的变量

    OC中的语言变量,按作用域可分为两种:局部变量和全局变量. 局部变量:也称为内部变量,局部变量是在方法内部声明的.其作用域仅限于方法内,离开该方法再使用这个变量就是非法的. 全局变量:也称为外部变量, ...

  4. myeclipse优化设置

    一.myeclipse字体设置Window->Preferences->General->Appearance->Colors and Fonts在右侧找到”Aa Test F ...

  5. c++ primer plus 习题答案(6)

    p425.1 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; ...

  6. 操作百度API

    string json = ""; try { //虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程 WebCli ...

  7. 【转载】python 模块 - random生成随机数模块

    随机数种子 要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的: random.seed(1) 这样random.randint(0,6, (4,5)) ...

  8. selenium + python自动化测试环境搭建--亲测

    环境准备: 1.下载所学安装包: setuptools https://pypi.python.org/packages/2.7/s/setuptools/ selenium https://pypi ...

  9. 01-C语言基本知识

    目录: 一.C语言基本知识 二.C语言概述 回到顶部 一.C语言基本知识 1 语言背景 1946年,美国冯·诺依曼第一台计算机. 四大部分:中央处理器(控制器,运算器),存储器,输入设备,输出设备. ...

  10. IOS 表视图(UITableVIew)的使用方法(7)表视图的编辑功能(拖拉调整排序位置)

    除了每个单元行左边的删除和新增图标,UITableView还支持在单元行的右侧显示一个供用户拖拉调整排序位置的控件. 不过如果要显示此控件,UITableView的数据源需要实现以下的方法. -(vo ...