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详细汇总的更多相关文章

  1. 100个iOS开发/设计程序员面试题汇总,你将如何作答?

    100个iOS开发/设计程序员面试题汇总,你将如何作答? 雪姬 2015-01-25 19:10:49 工作职场 评论(0)   无论是对于公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目, ...

  2. iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏

    iOS开发-CocoaPods使用详细说明 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来 ...

  3. iOS开发 - CALayer图层

    CALayer的基本使用 在iOS中.你能看得见摸得着的东西基本上都是UIView.比方一个button.一个文本标签.一个文本输入框.一个图标等等.这些都是UIView 事实上UIView之所以能显 ...

  4. iOS开发~CocoaPods使用详细说明

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  5. iOS开发~CocoaPods使用详细说明【转】

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  6. iOS开发之指定UIView的某几个角(小于4)为圆角

    在iOS开发中,我们经常会遇到View设置圆角的问题,如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore ...

  7. iOS 之 CALayer与UIView的区别

    最大区别:CALayer (图层)不会直接渲染到屏幕上. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它.它本身完全是由CoreAnimation来实现的. 真正的绘图部分,是由一 ...

  8. IOS开发UI基础UIView

    主要介绍下UIView得基本概念和一些属性的介绍至于属性的用户后面会由详细的介绍 -.UIView基本概念 1.什么是控件? 屏幕上所有的UI元素都叫做控件 (也有很多书中叫做视图 组件) 比如 按钮 ...

  9. ios 开发发布证书配置详细流程

    iOS证书配置实践 本文参考了: iOS证书配置指南:http://dev.umeng.com/push/ios/license-configuration-guide 写在前面: 团队开发证书的管理 ...

随机推荐

  1. (转)SQLServer实例讲解

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  2. SPSS数据分析—多重线性回归

    只有一个自变量和因变量的线性回归称为简单线性回归,但是实际上,这样单纯的关系在现实世界中几乎不存在,万事万物都是互相联系的,一个问题的产生必定多种因素共同作用的结果. 对于有多个自变量和一个因变量的线 ...

  3. LRU Cache [LeetCode]

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  4. iis 301重定向

    把www.a.com重定向到www.b.com 只需在www.a.com上面右键属性---主目录,重定向到url,下面填上www.b.com,再把资源永久重定向勾选上即可. 注意,如果你需要把域名后面 ...

  5. Server.UrlEncode()方法 空格转换成了+而非%20

    在ASP.NET MVC 的Control类里提供了该方法.该方法可以很方便的对字符串进行url编码,但小猪今天却发现其将空格编码后变成了“+”而非JavaScript采用的encodeURIComp ...

  6. iOS开发多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  7. String课后作业

    请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { @param args the command line argume ...

  8. 找做IT的男朋友会不会没有隐私

    找做IT的男朋友会不会没有隐私你不觉得自己在网上不断的“秀”啊,“晒”啊的行为才是根本所在吗?你应该怕自己的这种行为才对吧-—————————————————————————————————————— ...

  9. Java类文件最大限制

    今天在往一个jsp文件里添加代码时,项目跑起来访问这个jsp时报错.. The code of method _jspService(HttpServletRequest, HttpServletRe ...

  10. NOIP2014感想

    NOIP2014转眼就结束了,让人不由感慨时间之快,仿佛几天前还是暑假,几天后就已经坐在考场里了. 从暑假8月开始写博客,发了一些解题报告什么的,但这篇文章不再会是“题目大意 & 解题过程 & ...