CALayer与UIView的关系

2024-05-31 06:38
文章标签 关系 uiview calayer

本文主要是介绍CALayer与UIView的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CALayer属于Core Animation部分的内容,比较重要而不太好理解。以下是园子中看到的一篇文章的摘录:

1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。

2. UIView有个重要属性layer,可以返回它的主CALayer实例。

// 要访问层,读取UIView实例的layer属性
CALayer *layer = myView.layer

所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。
UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:

- (class)layerClass {
return ([CAEAGLLayer class]);
}

上述代码使得某个UIView的子类使用GL来进行绘制。

3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:

grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer:grayCover];

上述代码会在目标View上敷上一层黑色透明薄膜的效果。

4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。

5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。

6. 坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
某layer.anchorPoint = CGPointMake(0.f,0.f);
如果这么设置,只会将layer的左上角被挪到原来的中间位置,必须加上这一句:
某layer.position = CGPointMake(0.f,0.f);

最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影 (shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影......

7.渲染当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。

[gameLayer setNeedsDisplay];

若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:

[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];

如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。

[gameLayer renderInContext:UIGraphicsGetCurrentContext()];

8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。

characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);

CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform = transform;

9.变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。




 

CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个根CALayer,在UIView上的所有视觉效果都是在这个Layer上进行的。
CALayer外形特征主要包括:
1、层的大小尺寸
2、背景色
3、内容(可以填充图片或者使用Core Graphics绘制的内容)
4、矩形是否使用圆角
5、矩形是否有阴影

Layer有很多种,最常用也是最基本的是CALayer,当然还包括其他的子类:
CAScrollerLayer 简化显示层的一部分
CATextLayer 文本层
CAGradientLayer、CAShapeLayer等等

使用层之前,需要在项目中引入QuartzCore.framework框架


 
  1. #import "LayerSampleViewController.h" 
  2.  
  3. @implementation LayerSampleViewControlle
  4.  
  5. // Implement loadView to create view hierarchy programmatically, without using nib. 
  6. (void)loadView 
  7.     UIView *rootView [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 
  8.     rootView.backgroundColor [UIColor whiteColor]; 
  9.     self.view rootView; 
  10.     [rootView release]; 
  11.  
  12.     //加载layer 
  13.  
  14.     backLayer [CALayer layer]; 
  15.     backLayer.backgroundColor [UIColor orangeColor].CGColor; 
  16.     backLayer.bounds CGRectMake(10, 10, 1004, 728); //设置layer的区域 
  17.     backLayer.position CGPointMake(1024/2, 768/2-10); //设置layer坐标 
  18.     [self.view.layer addSublayer:backLayer]; 
  19.  
  20.  
  21. // Override to allow orientations other than the default portrait orientation. 
  22. (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
  23.     return interfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
  24.  
  25. (void)didReceiveMemoryWarning 
  26.     // Releases the view if it doesn't have superview. 
  27.     [super didReceiveMemoryWarning]; 
  28.  
  29.     // Release any cached data, images, etc that aren't in use. 
  30.  
  31. (void)viewDidUnload 
  32.     // Release any retained subviews of the main view. 
  33.     // e.g. self.myOutlet nil; 
  34.  
  35. (void)dealloc 
  36.     [super dealloc]; 
  37.  
  38. @end 

 


为了区分背景UIView,我将UIView的背景色设置为白色,backLayer的背景色设置为橘黄色。
上图是一个矩形区域,如果设置矩形的四个角是椭圆角,可以添加属性:
backLayer.cornerRadius = 20.0; //矩形椭圆角的弧度半径


添加带阴影的子Layer(层),代码:
//添加子layer
CALayer *cyanLayer = [CALayer layer];
cyanLayer.backgroundColor = [UIColor cyanColor].CGColor;
cyanLayer.bounds = CGRectMake(0, 0, 300, 300);
cyanLayer.position = CGPointMake(180, 180);
cyanLayer.shadowOffset = CGSizeMake(0, 3); //设置阴影的偏移量
cyanLayer.shadowRadius = 10.0; //设置阴影的半径
cyanLayer.shadowColor = [UIColor blackColor].CGColor; //设置阴影的颜色为黑色
cyanLayer.shadowOpacity = 0.9; //设置阴影的不透明度

[backLayer addSublayer:cyanLayer];


给子Layer添加图片

//添加子image layer
UIImage *image = [UIImage imageNamed:@"feiche.jpg"];
CALayer *imageLayer = [CALayer layer];
imageLayer.frame = CGRectMake(100, 100, image.size.width, image.size.height);
imageLayer.contents = (id) image.CGImage;
imageLayer.shadowOffset = CGSizeMake(0, 3); //设置阴影的偏移量
imageLayer.shadowRadius = 10.0; //设置阴影的半径
imageLayer.shadowColor = [UIColor blackColor].CGColor; //设置阴影的颜色为黑色
imageLayer.shadowOpacity = 0.9; //设置阴影的不透明度

[backLayer addSublayer:imageLayer];


图片加边框,代码:
imageLayer.borderColor = [UIColor grayColor].CGColor; //边框颜色
imageLayer.borderWidth = 2.0; //边框宽度


设置图片为椭圆角,代码:
imageLayer.cornerRadius = 10.0; //设置layer圆角半径
imageLayer.masksToBounds = YES; //隐藏边界


但是由于设置masksToBounds 属性为true所以Layer的阴影效果也就没有了。
之前我都是将图片另外在做有阴影效果的图片,这样显的比较真实,如果阴影部分只是填充边框即可,可以采用两个Layer来实现阴影效果,代码:
UIImage *image = [UIImage imageNamed:@"feiche.jpg"];
//阴影layer
CALayer *shadowLayer = [CALayer layer];
shadowLayer.frame = CGRectMake(100, 100, image.size.width, image.size.height);
shadowLayer.backgroundColor = [UIColor blueColor].CGColor;
shadowLayer.shadowOffset = CGSizeMake(0, 3);
shadowLayer.cornerRadius = 10.0;
shadowLayer.shadowRadius = 10.0;
shadowLayer.shadowColor = [UIColor blackColor].CGColor; //设置阴影的颜色为黑色
shadowLayer.shadowOpacity = 1.0; //设置阴影的不透明度
[backLayer addSublayer:shadowLayer];

//添加子image layer
CALayer *imageLayer = [CALayer layer];
imageLayer.frame = CGRectMake(100, 100, image.size.width, image.size.height);
imageLayer.contents = (id) image.CGImage;
imageLayer.cornerRadius = 10.0; //设置layer圆角半径
imageLayer.masksToBounds = YES; //隐藏边界
imageLayer.borderColor = [UIColor grayColor].CGColor; //边框颜色
imageLayer.borderWidth = 2.0;
[backLayer addSublayer:imageLayer];

这篇关于CALayer与UIView的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017518

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

一、关系模型和关系代数,《数据库系统概念》,原书第7版

文章目录 @[toc]一、引言1.1 什么是数据库1.2 数据完整性1.3 数据库的操作1.4 数据库的持久性1.5 数据库管理系统1.6 数据模型1.7 早期DBMS 二、关系模型2.1 什么是关系模型2.2 关系数据库的结构2.3 键2.4 约束2.5 数据操纵语言(DML)2.6 关系代数2.6.1 选择运算2.6.2 投影运算2.6.3 合并运算2.6.4 交运算2.6.5 差运算2.