CALayer2-创建新的层

本文目录

  • 一、添加一个简单的图层
  • 二、添加一个显示图片的图层
  • 三、为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?
  • 四、UIView和CALayer的选择
  • 五、UIView和CALayer的其他关系

上一讲已经说过,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也是父子关系。

时间: 2024-08-03 11:52:35

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

微软-创建数据访问层

简介 https://msdn.microsoft.com/zh-cn/cc964016 作为web 开发人员,我们的工作总是在和数据打交道.我们创建数据库来存储数据,编写代码来检索并修改数据,并创建Web 页面来收集和汇总数据.这是探讨在ASP.NET 2.0 中实现这些常用类型的技巧的系列教程中的首篇教程.我们从创建一个 软件架构 开始,包括使用Typed DataSet 的数据访问层(DAL) .实现自定义业务规则的业务逻辑层(BLL) 和共享同一页面布局的ASP.NET 页面组成的表示层

administrator无法创建新用户的解决

操作系统win2003sp2,已经是administrator了,但是创建新用户时提示: 在计算机 SERVER-05 上创建用户 abc 时,出现了以下错误: 拒绝访问. 百思不得其解,搜遍google和百度都没对症解药. 然后打开事件查看器,发现创建用户时系统抛错如下: SAM 无法更改数据库.很可能是因为内存 或磁盘空间不足.SAM 数据库会被还原为先前状态. 最近的更改都会丢失.请检查可用磁盘空间 和页面文件大小设置的最大值. 搜了下SAM的相关知识,估摸着要么是文件被破坏,要么是权限不

quick-cocos2d-x学习笔记【2】——项目结构分析、创建新场景

创建完一个新项目之后,我们可以简单的看一看这个项目的文件组成,有这么一个文件层次结构 几个proj.*文件夹就不用说了,是对应的平台的解决方案,res专门存放我们的游戏资源,scripts存放我们的lua代码,sources中有我们熟悉的AppDelegate类,我们主要常用的就两个文件夹,res和scripts(我这不是废话吗) 好吧,还是再打开scripts文件夹看下, 该文件下有main.lua,它是程序lua脚本的启动文件 function __G__TRACKBACK__(errorM

2013 Mac Air 装Win7双系统问题-安装程序无法创建新的分区,也无法定位系统 & Windows无法安装所需的文件,错误代码0x80070570

此非主讲安装过程,主说明过程中遇到的两个问题自己的解决方式. 准备: 准备以下Win7纯净版iso镜像,用Boot Camp方式安装Windows到16GU盘. Win7纯净版资源 问题一: Boot Camp开始分区安装后,进放Windows安装界面,在加载完之前下的驱动和点南完格式化选项后显示 : 安装程序无法创建新的分区,也无法定位系统 . 1)  出现此问题后,参考以下链接. http://support.apple.com/zh-cn/TS4599 苹果官方说明 http://www.

OPENBSD:如何创建新分区,如何使用u盘?

看到 u盘的消息后,就知道U盘的设备名称了.假设是 sd0, 那么接着运行 disklabel sd0 ,看卡 sd0 是怎么分区的,c 代表整个硬盘,剩下的代表分区,a.b.i等,组合起来就是分区名称: sd0a.sd0b.sd0c.sd0i 等,其中 sd0c 代表整个硬盘.同时 disklabel 显示分区的分区类型. 常见的分区是,一个c和i(当分区为Windows格式时显示为i分区).linux分区时显示为a分区. c 不能mount ,i 可以.运行mount /dev/sd0i /

jQuery学习笔记之DOM树、创建新节点、append方法

DOM树. 创建新节点.创建元素节点和文本节点. 创建元素节点/文本节点/属性节点 节点内部插入元素append方法 节点内部插入元素prepend方法 节点外部插入元素after方法 节点外部插入元素before方法 DOM树 创建div元素节点 创建元素节点和文本节点 创建元素节点.文本节点.属性节点 append方法 prepend方法 after方法 before方法

2016.8.07 this、new、模式工厂、创建新的构造函数

写在前面:今天我将发表函数基础.对象基础.this.new.封装.封装例子  这几篇个人理解文章.最好能一口气看完,并自己写下,相信会对想要理解函数和对象的朋友们会有一些帮助. 目录:模式工厂. this.new.创建新的构造函数 模式工厂:将对象放入函数中,批量创建对象 代码: function Student(name,age,sex){ var o=new Object();//先定义一个对象, o.name=name; o.age=age; o.sex=sex; o.sayHi=func

postgresql----根据现有表创建新表

除普通的建表语句"create table table_name(columns);"之外,还可以根据现有表快速的创建新表: 一.使用create table ... (like ...)创建一个和原表结构相同的新表,根据INCLUDING保留原表的约束,索引等. create table table_name (like parent_table {INCLUDING|EXCLUDING}{DEFAULTS|CONSTRAINTS|INDEXES|STORAGE|COMMENTS|A

关于HP DL380e服务器安装提示“安装程序无法创建新的系统分区也无法定位”

这里将刚刚遇到的一个服务器安装问题总结一下,以便自己后续使用,事实证明,几篇关于服务器的博文,收益最多的还是自己,因为每次都有不一样的问题,每次都在翻这些文章,所以我明白今天记下这个问题的重要性,Just for me!!! 说明一下,此类问题较为普遍,可能不是最优解,但是这里提供一下个人的见解,毕竟我个人在这个问题上成功了! 机型:HPDL380e 初始RAID:RAID1 本次安装的镜像为Server08 SP2,使用U盘刻录的镜像完成 再次说下吧,惠普的机器,F9是主板设置(可能不准确,但

在github上创建新分支

在github上创建新分支 - guang11cheng的专栏 - 博客频道 - CSDN.NET 在github上创建仓库: Create a new repository on the command line touch README.md git init git add README.md git commit -m "first commit" git remote add origin https://github.com/BrentHuang/MyRepo.git gi