CALayer的那些事(一)

CALayer对于工作过一段时间的程序员来说一定是熟悉的不能再熟悉了,但是对于一些接触iOS并不久的人来说还是比较新鲜的,就像我。再加上之前在学习时并没有接触过CALayer,所以这个东西对我来说完全就是新东西了。花了点时间看了下,就此总结一些需要注意的地方,以便日后用到时再详阅。

使用前需要注意的:

1.UIView和CALayer的选择

其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。

所以,在选择的过程中,需要考虑到实际的情况,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以

当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

2.CGColorRef和CGImageRef数据类型

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

3.CALayer访问子层和父层

UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通过sublayers属性访问所有的子层

   UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过superlayer属性访问父层

特别注意:如果一个控件是另外一个控件的子控件,那么这个控件的layer也是另一个控件的子layer。

使用时需要注意的:

一、属性

CALayer有2个非常重要的属性:position和anchorPoint

@property CGPoint position;

用来设置CALayer在父层中的位置

以父层的左上角为原点(0, 0)

@property CGPoint anchorPoint;

称为“定位点”、“锚点”

决定着CALayer身上的哪个点会在position属性所指的位置

以自己的左上角为原点(0, 0)

它的x、y取值范围都是0~1,默认值为(0.5, 0.5)

二、隐式动画

每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层)

所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画

什么是隐式动画?

当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果

而这些属性称为Animatable Properties(可动画属性)

列举几个常见的Animatable Properties:

bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画

backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画

position:用于设置CALayer的位置。修改这个属性会产生平移动画

关闭隐式动画

[CATransaction begin];    
[CATransaction setDisableActions:YES];     //隐式动画    
 self.layer.bounds=CGRectMake(0, 0, 200, 60);
 self.layer.backgroundColor=[UIColor yellowColor].CGColor;
[CATransaction commit];

可以查看头文件,看有没有Animatable,如果有则表示支持隐式动画。

时间: 2024-10-08 13:28:28

CALayer的那些事(一)的相关文章

CALayer的那些事(二)

这一篇是关于CALayer的自定义: 不管时UIView还是CALayer,绘制图形的步骤都差不多分这三步: (1)获取上下文 (2)绘制图形 (3)渲染图形 注意点: (1)CALayer里绘制的图形默认为无色,不会显示.要想让绘制的图形显示出来,还需要设置图形的颜色.注意不能直接使用UI框架中的类 (2)在自定义layer中的-(void)drawInContext:方法不会自己调用,只能自己通过setNeedDisplay方法调用,在view中画东西DrawRect:方法在view第一次显

小胖说事35-----Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

小胖说事35-----Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

[转]UIView 和 CALayer的那点事

(1)老祖 万物归根,UIView和CALayer都是的老祖都是NSObjet. 1: UIView的继承结构为: UIResponder : NSObject. 可以看出UIView的直接父类为UIResponder 类, UIResponder 是gsm的呢? 官方的解释: The UIResponder class defines an interface for objects that respond to and handle events. It is the superclass

UIView CALayer 的区别

UIView与CALayer的区别,很详细 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情.鉴于Core Animatio

CALayer与UIView的关系

CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它.它本身完全是由CoreAnimation来实现的.它真正的绘图部分,是由一个CALayer类来管理.UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性. 2. UIView有个重要属性la

CALayer一些知识~

(以下内容是我查阅一些资料的整理和自己的理解,如果有不对的地方,欢迎斧正~^_^) CALayer是什么? CALayer是UIView中的图层,UIView的内容展示就是通过CALayer来展示的.有人可能会问UIView不是展示内容的吗,怎么会通过CALayer来展示呢? 其实UIView中不止有图层,还有子控件的位置,以及其能接受的响应事件和和事件的处理过程等等一系列的组件组合成的.而每一个UIView都有一个根CALayer来绘制和展示自己的内容.iOS中基本上所有UIView的动画都是

CALayer 使用

CATextLayer适用于IOS或者MAC,比UIlable 和 NSTextView 能做的事很多UIlable用于IOS,大家都不陌生NSTextView 用于MACCATextLayer代码:CATextLayer *lary = [CATextLayer layer];    lary.string = @"dasfasa";    lary.bounds = CGRectMake(0, 0, 320, 20);       lary.font = @"HiraKa

UIView和CALayer的区别

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