CALayer---iOS-Apple苹果官方文档翻译之CALayer


CALayer

/*技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong */

 

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后,可以设置以下属性:

    1. bounds:宽度和高度!

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

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

    4. backgroundColor: 背景颜色(CGColorRef类型)!

    5. borderColor:边框颜色(CGColorRef类型)!

    6. borderWidth:边框宽度!

    7. cornerRadius:圆角半径!

    8. 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的部分属性时,相应的修改会自动产生动画效果,能执行隐式 动画的属性被称为“可动画属性”,诸如:!

    1. bounds: 缩放动画!

    2. 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的方式实现绘图! • 利用坐标系缩放比例翻转图像

 
获取CALayer中的内容--截屏
UIGraphicsBeginImageContext(self.view.bounds.size);

[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];!

UIImage *image =UIGraphicsGetImageFromCurrentImageContext();!

UIGraphicsEndImageContext();

!

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

本节知识点回顾

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

  • 要具体使用CALayer,需要引入!

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

  • 所有的非Root Layer都存在着隐式动画!

  • 创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用

    Quartz2D API在其中进行绘图!

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

© chenyilong. Powered by Postach.io

CALayer---iOS-Apple苹果官方文档翻译之CALayer的更多相关文章

  1. iOS数据存取---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog iOS数据存取---iOS-Apple苹果官方文档翻译 数据存取/*技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http:// ...

  2. iOS网络基础---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog iOS网络基础---iOS-Apple苹果官方文档翻译 iOS网络基础 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http: ...

  3. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  4. IOS开发苹果官方Sample Code及下载地址

    IOS开发苹果官方Sample Code及下载地址 在线浏览地址:https://developer.apple.com/library/ios/navigation/#section=Resourc ...

  5. UIWebView---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog UIWebView---iOS-Apple苹果官方文档翻译 UIWebView 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博h ...

  6. NSURLSession---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog NSURLSession---iOS-Apple苹果官方文档翻译 NSURLSession 技术博客http://www.cnblogs.com/ChenYilong/ ...

  7. iOS程序启动原理---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  8. 基本控件文档-UITableView---iOS-Apple苹果官方文档翻译

    //转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496969.html 技术博客http://www.cnblogs.com/ChenYi ...

  9. 基本控件文档-UITextField属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

随机推荐

  1. JQuery EasyUI 引用加载分析

    easyui是什么,就不介绍了,接触到前端的就算没用过,肯定也应该听说过.其次,本文不是介绍它提供如calendar.tree等这些功能如何使用的,这些官网上介绍都很详细,中文的网上也不少.本文是从e ...

  2. maven 实践 :管理依赖

    有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布...),但Maven给人造成这种错误的印象也是有原因的 ...

  3. Cobbler环境搭建

    Cobbler服务器系统: CentOS 6.6 64位Cobbler版本: cobbler-2.6.11IP地址:192.168.166.136 1.安装epel库 rpm -ivh http:// ...

  4. 基于Git制作电子书 GitBook

    GitBook 详细介绍 GitBook 是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书,GitBook 并非关于 Git 的教程. ...

  5. 第81天:jQuery 插件使用方法

    在追求页面互动效果的时代,大家都想把页面效果做的美轮美奂,这一切都离不开前端技术脚本Javascript,而最近常被人用到的Javascript库文件则是jQuery.  jQuery的使用具体步骤如 ...

  6. 【uoj#225】[UR #15]奥林匹克五子棋 构造

    题目描述 两个人在 $n\times m$ 的棋盘上下 $k$ 子棋,问:是否存在一种平局的情况?如果存在则输出一种可能的最终情况. 输入 第一行三个正整数 $n,m,k$ ,意义如前所述. 输出 如 ...

  7. (转)maven下载jar包速度慢(解决办法)

    本文转载至http://blog.csdn.net/ko289830707/article/details/53559052 现在maven项目非常流行,因为它对jar实行了一个非常方便的管理,我们可 ...

  8. 常州day1p4

    给定一棵 n 个点的树,树上每个节点代表一个小写字母,询问一个字符串 S 是否在树上出现过? 字符串 S 出现过即表示存在两个点 u,v,u 到 v 的最短路径上依次连接所有点上的字母恰好是 S N ...

  9. [JSOI2008]Blue Mary的战役地图——全网唯一一篇dp题解

    全网唯一一篇dp题解 网上貌似全部都是哈希+二分(反正我是大概baidu了翻了翻)(还有人暴力AC了的..) 哈希还是相对于dp还是比较麻烦的. 而且正确性还有可能被卡(当然这个题不会) 而且还容易写 ...

  10. 《剑指offer》— JavaScript(4)重建二叉树

    重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序 ...