iOS开发之CALayer
1、 概述
在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView,其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层:
@property(nonatomic,readonly,retain) CALayer *layer;
当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示。
换句话说,UIView本身不具备显示的功能,是它内部的图层有显示功能。
2、CALayer的属性
宽度和高度:
@property CGRect bounds;
位置(默认指中点,具体由anchorPoint决定):
@property CGPoint position;
锚点(x,y的范围都是0-1),决定了position的含义:
@property CGPoint anchorPoint;
背景颜色(CGColorRef类型):
@property CGColorRef backgroundColor;
形变属性:
@property CATransform3D transform;
边框颜色(CGColorRef类型):
@property CGColorRef borderColor;
边框宽度:
@property CGFloat borderWidth;
圆角半径:
@property CGColorRef borderColor;
内容(比如设置为图片CGImageRef):
@property(retain) id contents;
例如:
//边框宽度
self.iconView.layer.borderWidth = 10;
// 边框颜色
self.iconView.layer.borderColor = [UIColor greenColor].CGColor;
// 圆角
self.iconView.layer.cornerRadius = 10;
// 超出主层边框范围的内容都剪掉
self.iconView.layer.masksToBounds = YES;
// 阴影颜色
self.iconView.layer.shadowColor = [UIColor blueColor].CGColor;
// 阴影偏差
self.iconView.layer.shadowOffset = CGSizeMake(20, 20);
// 阴影不透明度
self.iconView.layer.shadowOpacity = 0.5;
【备注】新建图层:
CALayer *layer = [[CALayer alloc]init];
或者:
CALayer *layer = [CALayer layer];
例如:
// 新建图层
//CALayer *layer = [[CALayer alloc] init];
CALayer *layer = [CALayer layer];
layer.backgroundColor = [UIColor redColor].CGColor;
layer.bounds = CGRectMake(0, 0, 100, 100);
layer.position = CGPointMake(200, 100);
layer.cornerRadius = 10;
layer.masksToBounds = YES;
layer.contents = (id)[UIImage
imageNamed:@"lufy"].CGImage;
[self.view.layer addSublayer:layer];
运行结果:
3、x\y\z轴
坐标原点(0,0,0)
比如使图层宽度变成1.5倍,高度变成0.5倍:
self.iconView.layer.transform = CATransform3DMakeScale(1.5, 0.5, 0);
绕着(0,0,1)顺时针旋转45度,即绕着Z轴旋转45度:
self.iconView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
上面旋转等价于:
NSValue *value = [NSValue valueWithCATransform3D:
CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
[self.iconView.layer setValue:value forKeyPath:@"transform"];
也等价于:
[self.iconView.layer setValue:@(M_PI_4) forKeyPath:
@"transform.rotation"];
4、 关于CALayer的疑惑
首先:
(1)CALayer是定义在QuartzCore框架中的
(2)CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的
(1)UIColor、UIImage是定义在UIKit框架中的
其次:
(1)QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用
(2)但是UIKit只能在iOS中使用
(3)为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
5、UIView和CALayer的选择
通过CALayer,就能做出跟UIView一样的界面效果,既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?
其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。
所以,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以。
当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级。
6、position和anchorPoint
CALayer有2个非常重要的属性:position和anchorPoint:
@property CGPoint position;
(1)用来设置CALayer在父层中的位置
(2)以父层的左上角为原点(0, 0)
@property CGPoint anchorPoint;
(1)称为“定位点”、“锚点”,控件旋转动画围绕着锚点旋转
(2)决定着CALayer身上的哪个点会在position属性所指的位置,可用来将控件放到指定位置(设置锚点并把锚点放到position位置)
(3)以自己的左上角为原点(0, 0)
(4)它的x、y取值范围都是0~1,默认值为(0.5, 0.5),即默认是重点
例如:
CALayer *layer = [CALayer layer];
layer.bounds = CGRectMake(0, 0, 100, 100);
layer.backgroundColor = [UIColor redColor].CGColor;
layer.position = CGPointZero;
layer.anchorPoint = CGPointZero;
[self.view.layer addSublayer:layer];
7、隐式动画
每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层)。
所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画。
什么是隐式动画?
当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,而这些属性称为Animatable Properties(可动画属性)。
几个常见的Animatable Properties:
(1)bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
(2)backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
(3)position:用于设置CALayer的位置。修改这个属性会产生平移动画
可以通过动画事务(CATransaction)关闭默认的隐式动画效果:
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];
上述代码执行将不会再有动画效果。
iOS开发之CALayer的更多相关文章
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
- iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用
iOS开发之 Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...
- iOS开发之loadView、viewDidLoad及viewDidUnload的关系
iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系 标题中所说的3个方 ...
- iOS开发之info.pist文件和.pch文件
iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
随机推荐
- window nfs 服务端配置安装
windows7下面安装nfs客户端命令(首先开启windows客户端mount挂载命令): 打开或关闭windows功能>nfs服务(勾选上)重启 windows nfs共享有两种方式分别 ...
- PHP 数组处理
一:PHP 定义数组: PHP 代码 不能再 空的位置 打字 会报错 定义数组 方式1 $cars=array("Volvo","BMW","T ...
- Vuex 模块化与项目实例 (2.0)
Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为.但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就 ...
- kali linux live(persistence)+PE+windows7安装多启动菜单优盘制作
需要以下工具: 下载链接: 一.制作kali linux persistence 将32GU盘格式化为FAT32格式,使用win32diskimager将kalilinux镜像写入优盘,占用优盘3.4 ...
- HL-340编译驱动
make -C /lib/modules/3.4.39/build SUBDIRS=/home/linaro/Desktop/ch341_drv modulesmake: *** /lib/modul ...
- 单线程JavaScript
最近在阅读<你不知道的JavaScript中卷>,当我看到第二部分介绍异步和回调函数的一些知识时,由于该书在第二部分1.2章对线程.事件循环的概念介绍的并非详细,因此引发了我的一系列思考. ...
- 推荐一款好用的WSL终端模拟器
Windows 10 中包含了一个 WSL(Windows Subsystem for Linux)子系统,我们可以在其中运行未经修改过的原生 Linux ELF 可执行文件.利用它我们可以做很多事情 ...
- HTTP基础知识(二)
接着上一章的内容:HTTP基础知识(一) 二.简单的HTTP协议 1.客户端:请求访问文本或图像等资源的一端称为客户端: 服务器端:提供资源响应的一端 2.以百度为例子 这是请求头: 在起始行 ...
- ABP Zero 多租户管理
ABPZero - 多租户管理 启用多租户 ASP.NET Boilerplate和module-zero可以运行多租户或单租户模式.多租户默认为禁用.我们可以在我们的模块PreInitialize方 ...
- java读取文件方法总结
由于最近在做一个关于从手机本地读取格式化的txt文件中的内容,并且把内容放在listview中显示.这样问题来了,就是如何能够遍历已经获取到特定的map中就是一个问题,在网上找了一些资料,找到了一个很 ...