CALayer---iOS-Apple苹果官方文档翻译之CALayer
CALayer---iOS-Apple苹果官方文档翻译之CALayer
Core Animation是跨平台的,支持iOS环境和Mac OS X环境!
注意:凡是支持跨平台的框架,都不能直接使用UIKit框架,因为UIKit 框架只能应用在iOS而不能用于Mac!
!
学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象 是CALayer,而不是UIView!
!
CALayer是核心动画的基础,可以做圆角、阴影、边框等效果! !
每个UIView内部都有一个Layer的属性! !
在实现核心动画时,本质上是将CALayer中的内容转换成位图(一种 图像格式),从而便于图形硬件的操纵

UIView的CALayer基本演练
• 演练设置UIView中的CALayer属性!
- 圆角、边框、阴影及3D形变属性! !
• 注意:!
1. 在UIView中CALayer只是一个类声明,需要添加QuartzCore框架! 2. 在使用颜色时,不能直接使用UIColor而需要将颜色转成CGColor!
3. 修改图层相当于修改UIView属性,即修改了界面属性!
4. 要设置阴影,需要同时指定阴影的偏移尺寸、颜色和透明度! 5. 形变属性既可以用形变函数指定,也可以用keyPath指定

UIImageView的CALayer基本演练
• 演练1.设置UIImageView中的CALayer属性 - 圆角、边框、阴影!
- 注意:!
• UIImageView中不仅一个子图层,因此设置圆角时需要使用 setMasksToBounds:YES,让所有子图层跟随边框,不过设置
该属性后,无法使用阴影效果!
• 解决办法:可以在底层附加一个UIView实现阴影效果!
• 演练2.设置UIImageView中的CALayer属性!
- transform!
- 说明:transform属性可以调整CALayer的形变,其中包括:旋转、 缩放、平移!
- transform属性的参数查询:CATransform

CALayer中的圆角半径的示意图


transform属性表
|
keyPath |
说明 |
|
rotation.x |
X轴旋转角度NSNumber |
|
rotation.y |
Y轴旋转角度NSNumber |
|
rotation.z |
Z轴旋转角度NSNumber |
|
rotation |
Z轴旋转角度NSNumber |
|
scale.x |
X轴缩放比例NSNumber |
|
scale.y |
Y轴缩放比例NSNumber |
|
scale.z |
Z轴缩放比例NSNumber |
|
scale |
三个轴缩放比例NSNumber |
|
translation.x |
X轴平移量NSNumber |
|
translation.y |
Y轴平移量NSNumber |
|
translation.z |
Z轴平移量NSNumber |
|
translation |
X,Y轴平移量的NSValue CGPoint的包装 |
图层和视图之间的关系
• 创建视图对象时,视图会自己创建一个层,视图在绘图(如
drawRect:)时,会将内容画在自己的层上。当视图在层上完成绘图
后,系统会将图层拷贝至屏幕(CALayer绘图的上下文是图像,整个 画完后,才显示,提前绘制提高性能以及用户体验)。每个视图都有 一个层,每个图层又可以有多个子层!
!
• 提示:!
1. Layer的设计目的不是为了取代视图,不能基于CALayer创建一个
独立的可视化组件!
2. Layer的设计目的是提供视图的基本可视内容,以便提高动画的
执行效率!
3. 除提供可视内容外,Layer不负责视图的事件响应等工作,同时 Layer不能参与到响应者链条中

CALayer层次结构图


CALayer的使用说明
通过UIView的layer属性可以拿到对应的根层,这个层不允许重新创建,但可以
往层里面添加子层(调用CALayer的addSublayer)!
要具体使用CALayer,需要引入!
获取当前图层或使用静态方法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会方便一点

演练2--创建自定义图层
• 演练: 创建自定义图层,并设置以下属性:!
• bounds:宽度和高度!
• backgroundColor: 背景颜色(CGColorRef类型)!
• position:位置(默认指中点,具体由anchorPoint决定)!
• anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义! • contents:内容CGImageRef!
!
• 注意:!
1. 注意锚点和位置的关系,以及在旋转转换时对图层的影响!
2. 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: 平移动画!
!3. opacity: 淡入淡出动画(改变透明度)!
• 在文档中搜素animatable可以找到所有可动画属性! !
• 如果要关闭默认的动画效果,可以通过动画事务方法实现:! [CATransaction begin];!
[CATransaction setDisableActions:YES];!
// ...
[CATransaction commit];

演练3--CALayer的隐式动画 • 创建自定义图层!
• 在触摸事件中,设置图层的可动画属性:! -位置!
- 颜色!
- 透明度!
- 边框!
- 圆角!
- 旋转角度! - 内容!
- ......

在CALayer上绘图
• 要在CALayer上绘图,有两种方法:
1. 创建一个CALayer的子类,然后覆盖drawInContext:方法,可以 使用Quartz2D API在其中进行绘图!
2. 设置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绘图演练
• 演练重点:!
• 以自定义Layer的方式实现绘图! • 利用坐标系缩放比例翻转图像


[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];!
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();!
UIGraphicsEndImageContext();
!
说明:使用renderInContext方法可以将指定图层及其子图层中的内容渲 染输出到指定的上下文中

本节知识点回顾
每个UIView内部都有一个Layer的属性!
要具体使用CALayer,需要引入!
CALayer中使用CGColorRef和CGImageRef的数据类型,而不用 UIColor和UIImage!
所有的非Root Layer都存在着隐式动画!
创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用
Quartz2D API在其中进行绘图!
在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而 便于图形硬件的操纵

CALayer---iOS-Apple苹果官方文档翻译之CALayer的更多相关文章
- iOS数据存取---iOS-Apple苹果官方文档翻译
CHENYILONG Blog iOS数据存取---iOS-Apple苹果官方文档翻译 数据存取/*技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http:// ...
- iOS网络基础---iOS-Apple苹果官方文档翻译
CHENYILONG Blog iOS网络基础---iOS-Apple苹果官方文档翻译 iOS网络基础 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http: ...
- iOS静态库 ---iOS-Apple苹果官方文档翻译
iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...
- IOS开发苹果官方Sample Code及下载地址
IOS开发苹果官方Sample Code及下载地址 在线浏览地址:https://developer.apple.com/library/ios/navigation/#section=Resourc ...
- UIWebView---iOS-Apple苹果官方文档翻译
CHENYILONG Blog UIWebView---iOS-Apple苹果官方文档翻译 UIWebView 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博h ...
- NSURLSession---iOS-Apple苹果官方文档翻译
CHENYILONG Blog NSURLSession---iOS-Apple苹果官方文档翻译 NSURLSession 技术博客http://www.cnblogs.com/ChenYilong/ ...
- iOS程序启动原理---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- 基本控件文档-UITableView---iOS-Apple苹果官方文档翻译
//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496969.html 技术博客http://www.cnblogs.com/ChenYi ...
- 基本控件文档-UITextField属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
随机推荐
- shader language学习(1)——shader language简介背景
shader language,称为着色语言,shade在英语是阴影.颜色深浅的意思.shader language基于物体本身属性和光照条件,计算美格橡塑的颜色值. 实际上这种解释具有明显的时代局限 ...
- 软件工程个人作业3——集大通APP案例分析
第一部分:调研, 评测 1.第一次上手体验 主要界面截图: 感受: 1.界面不美观: 2.特色功能展现模块不突出,以上截图为打开APP所看到的界面展示,但是这些功能都不是该APP的特色功能,显得有些累 ...
- PHP与类有关的几个魔术方法
与类有关的其他魔术方法 序列化与反序列化技术 含义: 序列化: 就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘上的一种做法. 反序列化: 就是将序列化之后保存在硬盘上的“字符 ...
- 第124天:移动web端-Bootstrap轮播图插件使用
Bootstrap JS插件使用 > 对于Bootstrap的JS插件,我们只需要将文档实例中的代码粘到我们自己的代码中> 然后作出相应的样式调整 Bootstrap中轮播图插件叫作Car ...
- BZOJ4975 区间翻转
这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...
- 【JQuery】css操作
一.前言 接着上一章的内容,继续JQuery的学习 二.内容 css 设置或返回匹配元素的样式属性 $(selector).css(css-property-name) $(selec ...
- BZOJ1264 [AHOI2006]基因匹配Match 【LCS转LIS】
题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\( ...
- ZendFramework安装配置
1.创建项目目录 E:/wwwroot/myzfpro 运行cmd后,cd到框架源文件的bin目录 运行zf.bat创建命令:zf.bat create project E:/wwwroot/myzf ...
- 洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...
- 高性能相关、Scrapy框架
高性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...
