IOS开发-CALayer和UIView详细汇总
1. CALayer和UIView之间的关系:
- 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如UI控件、图标等等,都是UIView。
- 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个层(CALayer)。
- 在创建UIView对象时,UIView内部会自动创建一个层(即CALayer对象),通过UIView的layer属性可以访问这个层。当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。
- 换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能。
- UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。
设置图片的圆角和旋转:
UIImageView *im = [[UIImageView alloc]init];
im.frame = CGRectMake(, , , );
im.image = [UIImage imageNamed:@"收藏背景"];
im.layer.cornerRadius = ;
im.layer.masksToBounds = YES;
im.layer.transform = CATransform3DMakeRotation(M_PI_4, , , );
[self.view addSubview:im];
2.UIView可以通过addSubview:方法添加子视图,类似地,CALayer可以通过addSublayer:方法添加子层
CALayer *myLayer = [CALayer layer];
// 设置层的宽度和高度(100x100)
myLayer.bounds = CGRectMake(, , , );
// 设置层的位置
myLayer.position = CGPointMake(, );
// 设置需要显示的图片
myLayer.contents = (id)[UIImage imageNamed:@"0000.png"].CGImage;
// 设置层的圆角半径为10
myLayer.cornerRadius = ;
// 如果设置了图片,需要设置这个属性为YES才有圆角效果
myLayer.masksToBounds = YES; // 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
补充:CGImage是一种CGImageRef类型的数据
比如处理图片只显示某部分的时候,就用到了CGImageRef
UIImage *ima = [UIImage imageNamed:@"收藏背景"];
// 图片中需要显示的部分
CGRect rect = CGRectMake(, , , );
// 获得显示部分的数据
CGImageRef imageref = CGImageCreateWithImageInRect([ima CGImage], rect);
// 将数据转化为图片
UIImage *subimage = [UIImage imageWithCGImage:imageref];
UIImageView *imageview = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )];
imageview.image = subimage;
[self.view addSubview:imageview];
3.为什么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
4.如何选择UIView和CALayer?
UIView相对于CALayer来说就是多一个事件处理的功能,CALayer是不能处理用户的触摸事件。故如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以。
5.其实UIView的显示过程
当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法
在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕
6.自定义层
a.新建一个继承于CALayer的类AACALayer,然后覆盖drawInContext:方法,在里面绘图
-(void)drawInContext:(CGContextRef)ctx{
CGContextSetRGBFillColor(ctx, , , 0.5, );//填充,出现实心
// 起点
CGContextMoveToPoint(ctx, , );
// 从(50, 0)连线到(0, 100)
CGContextAddLines(ctx, , );
// 从(0, 100)连线到(100, 100)
CGContextAddLineToPoint(ctx, , );
// 绘制路径
CGContextClosePath(ctx);
}
则每次创建AACALayer,都会绘制一个三角形
AALayer *layer = [AALayer layer];
// 设置层的宽高
layer.bounds = CGRectMake(, , , );
// 设置层的位置
layer.position = CGPointMake(, );
// 开始绘制图层
[layer setNeedsDisplay];//写这个方法才会自动触发 drawInContext:的方法
[self.view.layer addSublayer:layer];
b.不想写子类,也可以直接使用代理可以新建层,drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx中绘图,但是不能将UIView设置为它的代理,否则和UIView内部就冲突了,因为UIView已经是内部根图层的degegate了。
CALayer *layerr = [CALayer layer];
// 设置层的宽高
layerr.bounds = CGRectMake(, , , );
// 设置层的位置
layerr.position = CGPointMake(, );
laere.delegate - self;
// 开始绘制图层
[layer setNeedsDisplay];//无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。
[self.view.layer addSublayer:layer]; //在代理方法中
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
// 设置颜色
CGContextSetRGBStrokeColor(ctx, , , , );//这不填充,空心
// 设置边框宽度
CGContextSetLineWidth(ctx, ); // 将矩形放到路径中
CGContextAddRect(ctx, layer.bounds); // 绘制路径
CGContextStrokePath(ctx);
}
IOS开发-CALayer和UIView详细汇总的更多相关文章
- 100个iOS开发/设计程序员面试题汇总,你将如何作答?
100个iOS开发/设计程序员面试题汇总,你将如何作答? 雪姬 2015-01-25 19:10:49 工作职场 评论(0) 无论是对于公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目, ...
- iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏
iOS开发-CocoaPods使用详细说明 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来 ...
- iOS开发 - CALayer图层
CALayer的基本使用 在iOS中.你能看得见摸得着的东西基本上都是UIView.比方一个button.一个文本标签.一个文本输入框.一个图标等等.这些都是UIView 事实上UIView之所以能显 ...
- iOS开发~CocoaPods使用详细说明
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- iOS开发~CocoaPods使用详细说明【转】
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- iOS开发之指定UIView的某几个角(小于4)为圆角
在iOS开发中,我们经常会遇到View设置圆角的问题,如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore ...
- iOS 之 CALayer与UIView的区别
最大区别:CALayer (图层)不会直接渲染到屏幕上. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它.它本身完全是由CoreAnimation来实现的. 真正的绘图部分,是由一 ...
- IOS开发UI基础UIView
主要介绍下UIView得基本概念和一些属性的介绍至于属性的用户后面会由详细的介绍 -.UIView基本概念 1.什么是控件? 屏幕上所有的UI元素都叫做控件 (也有很多书中叫做视图 组件) 比如 按钮 ...
- ios 开发发布证书配置详细流程
iOS证书配置实践 本文参考了: iOS证书配置指南:http://dev.umeng.com/push/ios/license-configuration-guide 写在前面: 团队开发证书的管理 ...
随机推荐
- 一个php soap的错误记录
今天使用php soap实现两个系统之间的互通 在写好php的soapserver后,client端调用一直报 looks like we got no XML document,尝试好久后无法解决 ...
- Java中常用的运算符
运算符是一种“功能”符号,用以通知 Java 进行相关的运算,Java 语言中常用的运算符可分为如下几种: 算数运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符. 一.算数运算符 Java 中常 ...
- C++获取鼠标位置及全局检测鼠标行为
1.获取鼠标位置(在屏幕的位置) CPoint m_mouse; GetCursorPos(&m_mouse); 2. 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置 ...
- 51nod1693 水群
题目链接:51nod1693 水群 题解参考大神的博客:http://www.cnblogs.com/fighting-to-the-end/p/5874763.html 这题时限0.4秒,真的够狠的 ...
- 2个集合比较——最高效解法(Java实现)
优点:时间复杂度为O(n)级别: 缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多. 理论分析: 两个集合的元素之和以及之积相同则,这两个集合相等.(前提是两个集合的数量一致) 证 ...
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...
- java 解决汉诺塔问题
//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...
- linux maven安装配置
1.Run the wget command from the dir you want to extract maven too. wget http://mirrors.cnnic.cn/apac ...
- linux下用phpize给PHP动态添加扩展
使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了. 如我想增加bcmath扩展的支持,这 ...
- cocoapods 更新失败 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
http://blog.csdn.net/dark_gmn/article/details/49274993 ERROR: Could not find a valid gem 'cocoapods ...