本文目录

* 上一讲已经说过,UIView内部默认有个CALayer对象(层),通过layer属性可以访问这个层。要注意的是,这个默认的层不允许重新创建,但可以往层里面添加子层
* UIView可以通过addSubview:方法添加子视图,类似地,CALayer可以通过addSublayer:方法添加子层
接下来演示一下如何添加子层:

一、添加一个简单的图层

 1 CALayer *myLayer = [CALayer layer];
2 // 设置层的宽度和高度(100x100)
3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
4 // 设置层的位置
5 myLayer.position = CGPointMake(100, 100);
6 // 设置层的背景颜色:红色
7 myLayer.backgroundColor = [UIColor redColor].CGColor;
8 // 设置层的圆角半径为10
9 myLayer.cornerRadius = 10;
10
11 // 添加myLayer到控制器的view的layer中
12 [self.view.layer addSublayer:myLayer];

* 第1行创建了一个自动释放的CALayer对象,你也可以使用经典的alloc和init方法来创建

* 第12行将创建好的层添加到控制器的view的层中

二、添加一个显示图片的图层

 1 CALayer *myLayer = [CALayer layer];
2 // 设置层的宽度和高度(100x100)
3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
4 // 设置层的位置
5 myLayer.position = CGPointMake(100, 100);
6 // 设置需要显示的图片
7 myLayer.contents = (id)[UIImage imageNamed:@"lufy.png"].CGImage;
8 // 设置层的圆角半径为10
9 myLayer.cornerRadius = 10;
10 // 如果设置了图片,需要设置这个属性为YES才有圆角效果
11 myLayer.masksToBounds = YES;
12
13 // 添加myLayer到控制器的view的layer中
14 [self.view.layer addSublayer:myLayer];

* 在第7行设置需要显示的图片,注意,这里用的是UIImage的CGImage属性,是一种CGImageRef类型的数据

三、为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?

* 首先要知道:CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的

* 其次,QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用

* 因此,为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

* 不过很多情况下,可以通过UIKit对象的特定方法,得到CoreGraphics对象,比如UIImage的CGImage方法可以返回一个CGImageRef

四、UIView和CALayer的选择

细心的朋友不难发现,其实前面的2个效果不仅可以通过添加层来实现,还可以通过添加UIView来实现。比如,第1个红色的层可以用一个UIView来实现,第2个显示图片的层可以用一个UIImageView来实现。 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?

* 其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以

* 所以,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以

* 当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

五、UIView和CALayer的其他关系

* UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通过sublayers属性访问所有的子层

* UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过superlayer属性访问父层

* 下面再看一张UIView和CALayer的关系图:

如果两个UIView是父子关系,那么它们内部的CALayer也是父子关系。

CALayer2-创建新的层的更多相关文章

  1. SQL基础-创建新的输出字段

    一.创建新的输出字段 1.建表.插数据 ### CREATE TABLE `t_stock_trans_dtl` ( `trans_id` varchar(100) NOT NULL COMMENT ...

  2. docker2-镜像原理及创建新的镜像

    1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...

  3. Bonobo创建新库出错,解决方案

    创建新库出错如下: Native library pre-loader is trying to load native SQLite library "D:\wwwroot\localho ...

  4. linux创建新用户以及修改密码

    1. 使用root账户创建新用户 useradd webuser 2. 修改新增的用户的密码 passwd webuser 这时候会提示你输入新的密码: 注意:不要用su webuser进入该账户修改 ...

  5. 安装SQL Developer,连接Oracle 12c,创建新用户

    1.访问Oracle官网:https://www.oracle.com/index.html,下载SQL Developer 2.安装... 3.打开Sql Developer,右键"创建新 ...

  6. php创建新用户注册界面布局实例

    php创建新用户注册界面布局实例 <!DOCTYPE> <html> <head> <title>Load page</title> < ...

  7. Azure ARM (13) 从现有VHD文件,创建新的ARM VM

    <Windows Azure Platform 系列文章目录> 本文参考了Git Hub的ARM Template: https://github.com/Azure/azure-quic ...

  8. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  9. 创建新用户,连接Oracle数据库

    1.sys用户是最高管理员用户,那我们就用这个sys用户登录oracle:

  10. cocos2d-x3.2创建新项目失败的一种可能性(cygwin自带的python2.6被抢先执行)

    之前一直使用cocos2d-x2.2写游戏,写了几个游戏后,想尝试下3.x版本的新功能,就下载了cocos2d-x3.2版本. 参照官方文档的说法,cocos2d-x3.x版本需要python2.7环 ...

随机推荐

  1. Mac 升级node与npm

    第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...

  2. js从一个select选择数据添加到另一个select(包括移除)

    一.实现效果 二.要求 1.选中左侧的菜单,点击“>>”,该菜单(1项或多项选中的)将添加到右侧菜单 2.选中右侧菜单,点击“<<”,则移除选中的菜单 3.点击“>> ...

  3. IdentityServer4在Asp.Net Core中的应用(一)

    IdentityServer4是一套身份授权以及访问控制的解决方案,专注于帮助使用.Net 技术的公司为现代应用程序建立标识和访问控制解决方案,包括单点登录.身份管理.授权和API安全. 下面我将具体 ...

  4. Java Applet基础

    applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序. 如下所示是独立的Java应用程序和app ...

  5. python PIL/Pillow图像扩展、复制、粘贴处理

    http://blog.csdn.net/yuanyangsdo/article/details/60957685

  6. C#转译字符

    C#转义字符: 一种特殊的字符常量 以反斜线"\"开头,后跟一个或几个字符 具有特定的含义,不同于字符原有的意义,故称“转义”字符. 主要用来表示那些用一般字符不便于表示的控制代码 ...

  7. Redis-CentOS7安装

    安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统. ...

  8. LInux50个基本命令

    cd:(切换)vim:(创建文件)   vi:编辑文件bc:(计算器)quit:退出计算器mkdir:(创建目录)   mkdir -p:递归建立目录rmdir:(删除目录)arch:(显示处理器X8 ...

  9. SpringMVC之ModelAndView的 jsp值在浏览页面不显示

    Tomcat运行后浏览器上显示的结果! <%@ page isELIgnored="false" %>改变后问spring mvc开发过程中, 经常会给model ad ...

  10. 十八 Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/env python # -*- coding:utf8 -*- from scrapy.cmdline import ...