IOS开发-CALayer和UIView详细汇总
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了IOS开发-CALayer和UIView详细汇总,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3982字,纯文字阅读大概需要6分钟。
内容图文
1. CALayer和UIView之间的关系:
- 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如UI控件、图标等等,都是UIView。
- 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个层(CALayer)。
- 在创建UIView对象时,UIView内部会自动创建一个层(即CALayer对象),通过UIView的layer属性可以访问这个层。当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。
- 换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能。
- UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。
设置图片的圆角和旋转:
1 UIImageView *im = [[UIImageView alloc]init];
2 im.frame = CGRectMake(100, 100, 100, 100);
3 im.image = [UIImage imageNamed:@"收藏背景"];
4 im.layer.cornerRadius = 10;
5 im.layer.masksToBounds = YES;
6 im.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
7 [self.view addSubview:im];
2.UIView可以通过addSubview:方法添加子视图,类似地,CALayer可以通过addSublayer:方法添加子层
1 CALayer *myLayer = [CALayer layer];
2// 设置层的宽度和高度(100x100) 3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
4// 设置层的位置 5 myLayer.position = CGPointMake(200, 100);
6// 设置需要显示的图片 7 myLayer.contents = (id)[UIImage imageNamed:@"0000.png"].CGImage;
8// 设置层的圆角半径为10 9 myLayer.cornerRadius = 10;
10// 如果设置了图片,需要设置这个属性为YES才有圆角效果11 myLayer.masksToBounds = YES;
1213// 添加myLayer到控制器的view的layer中14 [self.view.layer addSublayer:myLayer];
补充:CGImage是一种CGImageRef类型的数据
比如处理图片只显示某部分的时候,就用到了CGImageRef
1 UIImage *ima = [UIImage imageNamed:@"收藏背景"];
2// 图片中需要显示的部分 3 CGRect rect = CGRectMake(50, 50, 70, 70);
4// 获得显示部分的数据 5 CGImageRef imageref = CGImageCreateWithImageInRect([ima CGImage], rect);
6// 将数据转化为图片 7 UIImage *subimage = [UIImage imageWithCGImage:imageref];
8 UIImageView *imageview = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
9 imageview.image = subimage;
10 [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:方法,在里面绘图
1 -(void)drawInContext:(CGContextRef)ctx{ 3 CGContextSetRGBFillColor(ctx, 0, 1, 0.5, 1);//填充,出现实心 5// 起点 7 CGContextMoveToPoint(ctx, 50, 0); 9// 从(50, 0)连线到(0, 100)11 CGContextAddLines(ctx, 0, 100);13// 从(0, 100)连线到(100, 100)15 CGContextAddLineToPoint(ctx, 100, 100);17// 绘制路径19 CGContextClosePath(ctx);
2021 }
则每次创建AACALayer,都会绘制一个三角形
1 AALayer *layer = [AALayer layer];
2// 设置层的宽高3 layer.bounds = CGRectMake(0, 0, 100, 100);
4// 设置层的位置5 layer.position = CGPointMake(100, 100);
6// 开始绘制图层7 [layer setNeedsDisplay];//写这个方法才会自动触发 drawInContext:的方法8 [self.view.layer addSublayer:layer];
b.不想写子类,也可以直接使用代理可以新建层,drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx中绘图,但是不能将UIView设置为它的代理,否则和UIView内部就冲突了,因为UIView已经是内部根图层的degegate了。
1 CALayer *layerr = [CALayer layer];
2// 设置层的宽高 3 layerr.bounds = CGRectMake(0, 0, 100, 100);
4// 设置层的位置 5 layerr.position = CGPointMake(100, 100);
6 laere.delegate - self;
7// 开始绘制图层 8 [layer setNeedsDisplay];//无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。
9 [self.view.layer addSublayer:layer];
1011//在代理方法中12 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
13// 设置颜色14 CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);//这不填充,空心
15// 设置边框宽度16 CGContextSetLineWidth(ctx, 5);
1718// 将矩形放到路径中19 CGContextAddRect(ctx, layer.bounds);
2021// 绘制路径22 CGContextStrokePath(ctx);
23 }
原文:http://www.cnblogs.com/chenhongios/p/4849559.html
内容总结
以上是互联网集市为您收集整理的IOS开发-CALayer和UIView详细汇总全部内容,希望文章能够帮你解决IOS开发-CALayer和UIView详细汇总所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。