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. null和undefined

    null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. undefined表示"缺少 ...

  2. jquery动画基础

    根据id改变字体大小的动画 <div class="speech">样式切换</div> <div id="switcher"&g ...

  3. org.apache.commons.lang.StringUtils类

    org.apache.commons.lang.StringUtils类 本文摘自:(http://www.blogjava.net/japper/archive/2012/05/23/378946. ...

  4. iOS开发网络篇—网络编程基础

    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...

  5. samba服务--路径太深问题-转

  6. Mobiscroll 3.0 官方同步版

    Mobiscroll 3.0 官方同步版发布了. Mobiscroll是一个用于触摸设备的日期和时间选择器,它的使用不会改变HTML5.PhoneGap以及混合应用的原生用户体验.作为一款jQuery ...

  7. MySQL主机127.0.0.1与localhost区别总结

    1. mysql -h 127.0.0.1 的时候,使用TCP/IP连接, mysql server 认为该连接来自于127.0.0.1或者是"localhost.localdomain&q ...

  8. hdu 2084

    ps:这道题...是DP题..所以我去看了百度一些东西,才知道了什么是状态方程,状态转移方程.. 做的第一个DP题,然后TLE一次.贴上TLE的代码: #include "stdio.h&q ...

  9. BZOJ 1500 Splay 全操作

    好久没写splay了,写一发(写了一节课,调了一节课) #include <iostream> #include <cstring> #include <cstdio&g ...

  10. 1、webservice的简单使用

    1.新建一个web端项目 2.点击添加项,选择web服务 3.在已经建好的项目中写一个方法 4.发布(发布方法选文件系统,web需要管理员权限) 生成文件夹: 5.配置IIS(略) 6.调用webse ...