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. C++ const、volatile、mutable的用法 (转)

      const.volatile.mutable的用法 鸣谢作者: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通 ...

  2. wireshark过滤使用

    过滤器的区别 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(DisplayFilters):在捕捉结果中进行详细查找.他们可以在 ...

  3. CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chrome、Opera

    CSS Hack大全-教你如何区分出IE6-IE10.FireFox.Chrome.Opera 转载自:http://www.jb51.net/article/50116.htm 现在的浏览器IE6- ...

  4. MVC部署到iis

    程序域功能->打开或关闭->iis信息服务及.net framework下的两个要勾选 1. 发布程序,以文件系统file system 的形式,发布到一个文件夹里    自定义-> ...

  5. Android 系统ID介绍

    Android上系统ID有很多,本文只介绍常用的ANDROID ID.DEVICE ID.IMEI/MEID.WIFI/BT ADDRESS等几个,本文介绍这些ID的数据格式.长度及一些基本知识. 一 ...

  6. Windows Store App 访问应用内部文件

    访问应用程序内部的文件可以使用多种不同的方法,13.1节中已经介绍过相关的方法,除此之外,还可以使用文件的URI地址直接对文件进行检索,这种访问方式需要用到StorageFile类的静态方法GetFi ...

  7. wheel和staff分组

    1.只有属于wheel组的用户才可以用su登录为root 2. 具体设置步骤如下: 1)修改 /etc/pam.d/su 文件,找到"#auth required /lib/security ...

  8. iOS开发多线程篇—NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

  9. BestCoder Round #40

    T1:Tom and pape (hdu 5224) 题目大意: 给出一个矩形面积N,求周长的最小值.(长&&宽&&面积都是正整数) N<=109 题解: 没啥好 ...

  10. Setup Spark source code environment

    1. Install Java and set JAVA_HOME 2. Install Eclipse Juno Java IDE, Scala plugin and Scala Test 3. D ...