一、CALayer简介

Core Animation是跨平台的,支持iOS环境和Mac OS X环境

凡是支持跨平台的框架,都不能直接使用UIKit框架,因为UIKit框架只能应用在iOS而不能用于Mac

需要先理解CALayer,因为核心动画操作的对象是CALayer,而不是UIView

CALayer是核心动画的基础,可以做圆角、阴影、边框等效果

每个UIView内部都有一个Layer的属性

在实现核心动画时,本质上是将CALayer中的内容转换成位图(一种图像格式),从而便于图形硬件的操纵

二、UIView的CALayer基本属性

设置UIView中的CALayer属性

圆角、边框、阴影及3D形变属性

在UIView中CALayer只是一个类声明,需要添加QuartzCore框架

在使用颜色时,不能直接使用UIColor而需要将颜色转成CGColor

修改图层相当于修改UIView属性,即修改了界面属性

要设置阴影,需要同时指定阴影的偏移尺寸、颜色和透明度

形变属性既可以用形变函数指定,也可以用keyPath指定

三、UIImageView的CALayer基本属性

设置UIImageView中的CALayer属性

圆角、边框、阴影

UIImageView中不仅一个子图层,因此设置圆角时需要使用setMasksToBounds:YES,让所有子图层跟随边框,不过设置该属性后,无法使用阴影效果

可以在底层附加一个UIView实现阴影效果

设置UIImageView中的CALayer属性

transform属性可以调整CALayer的形变,其中包括:旋转、缩放、平移

transform属性的参数查询:CATransform

四、图层和视图之间的关系

创建视图对象时,视图会自己创建一个层,视图在绘图(如drawRect:)时,会将内容画在自己的层上。当视图在层上完成绘图后,系统会将图层拷贝至屏幕(CALayer绘图的上下文是图像,整个画完后,才显示,提前绘制提高性能以及用户体验)。每个视图都有一个层,每个图层又可以有多个子层

Layer的设计目的不是为了取代视图,不能基于CALayer创建一个独立的可视化组件

Layer的设计目的是提供视图的基本可视内容,以便提高动画的执行效率

除提供可视内容外,Layer不负责视图的事件响应等工作,同时Layer不能参与到响应者链条中

五、CALayer的使用说明

通过UIView的layer属性可以拿到对应的根层,这个层不允许重新创建,但可以往层里面添加子层(调用CALayer的addSublayer)

要具体使用CALayer,需要引入<QuartzCore/QuartzCore.h>

获取当前图层或使用静态方法layer初始化CALayer后,可以设置以下属性

bounds:宽度和高度

position:位置(默认指中心点,具体由anchorPoint决定)

anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义

backgroundColor: 背景颜色(CGColorRef类型)

borderColor:边框颜色(CGColorRef类型)

borderWidth:边框宽度

cornerRadius:圆角半径

contents: 内容(比如设置为图片CGImageRef)

虽然CALayer可以使用frame,但最好还是使用bounds和position。为层设置动画时,用bounds和position会方便一点

六、创建自定义图层

创建自定义图层,并设置以下属性:

bounds:宽度和高度

backgroundColor: 背景颜色(CGColorRef类型)

position:位置(默认指中点,具体由anchorPoint决定)

anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义

contents:内容CGImageRef

锚点和位置的关系,以及在旋转转换时对图层的影响

UIView有一个addSubview方法,而layer有一个addSubLayer方法

锚点在游戏开发中使用比较频繁,而在应用开发中极少使用

七、CALayer中图像及颜色的注意事项

CALayer中使用CGColorRef和CGImageRef的数据类型,而不用UIColor和UIImage

QuartzCore(包含CALayer类)和Core Graphics(包含CGImageRef、CGColorRef)框架都能在iOS和Mac OS X上使用,但是UIKit(包含UIImage和其他UI开头的类)只能在iOS中使用

为了保证可移植性,QuartzCore不能使用UIImage,只能使用CGImageRef

不过很多情况下,可以通过UIKit对象的特定方法,可以得到Core Graphics对象,如UIImage的CGImage方法和UIColor的CGColor方法

八、CALayer的隐式动画属性

每一个UIView内部都默认关联着一个CALayer,称这个Layer为Root Layer。所有的非Root Layer都存在着隐式动画,隐式动画的默认时长为1/4秒。

当修改非Root Layer的部分属性时,相应的修改会自动产生动画效果,能执行隐式动画的属性被称为“可动画属性”,诸如:

bounds: 缩放动画

position: 平移动画

opacity: 淡入淡出动画(改变透明度)

在文档中搜素animatable可以找到所有可动画属性

如果要关闭默认的动画效果,可以通过动画事务方法实现:

[CATransaction begin];

[CATransaction setDisableActions:YES];

[CATransaction commit];

九、在CALayer上绘图

要在CALayer上绘图,有两种方法:

创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图

设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图

不能再将UIView设置为这个CALayer的delegate,因为UIView对象已经是内部层的delegate,再次设置会出问题

无论使用哪种方法,都必须向层发送setNeedsDisplay消息,以触发相应绘图方法的调用

十、CALayer、UIView以及上下文之间的关系

当UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,然后向它的delegate即UIView,发送消息,并且传入已经准备好的CGContextRef对象。UIView在drawLayer:inContext:方法中会调用自己的drawRect:方法

平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由CALayer传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CALayer的CGContextRef中,然后被拷贝至屏幕

CALayer的CGContextRef用的是位图上下文(Bitmap Graphics Context)

十一、获取CALayer中的内容——截屏

UIGraphicsBeginImageContext(self.view.bounds.size);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

说明:使用renderInContext方法可以将指定图层及其子图层中的内容渲染输出到指定的上下文中

iOS基础 - CALayer的更多相关文章

  1. ios基础动画、关键帧动画、动画组、转场动画等

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  2. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  3. iOS 基础日记-修饰符

    今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...

  4. iOS基础问答面试

    <简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...

  5. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  6. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  7. iOS 基础:Frames、Bounds 和 CGGeometry

    https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...

  8. iOS 基础入门--Bull' Eye 小游戏 

      说明   Bull's Eye小游戏是http://www.raywenderlich.com/store/ios-apprentice里非常酷的入门demo 跟着该教程一步步做下来便有了 ...

  9. iOS 基础函数解析 - Foundation Functions Reference

    iOS 基础函数解析 - Foundation Functions Reference 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名- ...

随机推荐

  1. sql多表查询之一:Where 和 On的秘密

    原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某 ...

  2. HTML5 Introduction

    1. HTML5 History HTML4.01 –1999.12 HTML5 – 2014.10– Done (8 years) In2006, WHATWG&W3C, decide to ...

  3. Ubuntu通过使用PyCharm 进行调试 Odoo 8.0 可能出现的问题

    实现步骤,请移步http://shine-it.net/index.php?topic=16603.0 要么 http://www.mindissoftware.com/2014/09/11/Run- ...

  4. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

  5. iOS10收集IDFA,植入第三方广告[终结]--ADMob

    [PS: 前段时间,公司做ASO推广,需要在应用中收集IDFA值,跟广告平台做交互!于是有了这个需求--] 1.首先,考虑了一下情况(自己懒 -_-#),就直接在首页上写了一个Banner,循环加载广 ...

  6. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  7. OpenVPN多实例优化的思考过程

    1.sss 当构建组件之间的关系已经错综复杂到接近于一张全然图的时候,就要换一个思路了,或者你须要重构整个系统,或者你将又一次实现一个. 2.TAP网卡和TUN网卡 2.1.TAP的优势 1.方便组网 ...

  8. Set Matrix Zeroes -- LeetCode

    原题链接: http://oj.leetcode.com/problems/set-matrix-zeroes/ 这是一个矩阵操作的题目,目标非常明白,就是假设矩阵假设有元素为0,就把相应的行和列上面 ...

  9. C++内存泄露的有效预防方法:谁使用,谁删除 (1.2)

    内存泄露就是new出来的东西没有delete,我们能够这样:创建动态对象的人虽然使用new来创建对象:使用此对象的人负责释放此内存块. 比如:我和他人共享一个消息队列,他人将消息(new出来的对象)放 ...

  10. 使用C语言编写windows服务一般框架

    原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...