UIView和CALayer

1. UIView

UIView是UIKit框架,在iOS中能看得见的东西基本上都是UIView,比如:按钮,标签,文本输入框,图片等等;

在创建UIView对象的时候,UIView内部会自动创建一个图层(即CALayer对象);UIView之所以能够显示,就是因为内部的这个CALayer图层。当UIView要显示在屏幕上时,会调用drawRect:方法进行绘制,并将所有内容绘制爱自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,这样UIView就会显示了。

UIView 主要负责监听,响应事件;CALayer主要负责视图中显示内容和动画。

 

 

2. CALayer

CALayer是定义在QuartzCore框架中的;QuartzCore框架是CoreGraphics框架可以跨平台使用,在iOS和Mac OS上都能使用,UIKit只能在iOS中使用。

CALayer:CA就是Core Animation核心动画,layer是层的意思。

所有的核心动画都是基于这个CALayer层来实现的。

 

2.1 CALayer有两个重要属性position(位置)和anchorPoint(锚点)

(1)@property CGPoint position;

用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0)

(2)@property CGPoint anchorPoint;

此属性成为“定位点”、“锚点”;决定着CALayer的position属性所指的是哪个点;以自己的左上角为原点(0,0);它的x、y取值范围都是0~1,默认值为(0.5, 0.5)。

layer.anchorPoint = CGPointMake(0, 0.5);

 

2.2 通过CALayer对象,可以很方便地调整UIView的一些外观属性

如:

CALayer *layer = [CALayer layer];

(1)bounds

layer.bounds = CGRectMake(0, 0, 200, 200);

(2)layer的backgroundColor(需要讲颜色转为CGColorRef)

layer.backgroundColor = [UIColor redColor].CGColor;

(3)阴影

layer.shadowColor = [UIColor blueColor].CGColor;

layer.shadowRadius = 10;

layer.shadowOffset = CGSizeMake(20, 20);

layer.shadowOpacity = 1.0;

(4)圆角大小

layer.cornerRadius = layer.bounds.size.width * 0.5;

如果是添加的图片还需要进行裁剪

layer.masksToBounds = YES;

(5)设置透明度

layer.opacity = 1.0;

(5)边框宽度和颜色

layer.borderColor = [UIColor yellowColor].CGColor;

layer.borderWidth = 5;

 

2.3 CALayer属性

(1)contents

@property(nullable, strong) id contents;

给contents属性赋任何值,都能通过编译;在实践中,如果给contents赋的值不是CGImage,得到的图层是空白的。

真正赋值的类型是CGImageRef,它是一个指向CGImage结构的指针;UIImage有一个CGImage属性,它返回一个“CGImageRef”,若是将这个值赋给contents,那么编译就会出错;CGImageRef并不是一个Cocoa对象,而是一个Core Foundation类型;两者可以通过bridge关键字转:

layer.contents = (__bridge id)image.CGImage;

(2)transform

<1>平移:平移的时候只有在x,y,设置值有效果,会在x或y轴方向进行平移,在z轴没有效果

layer.transform = CATransform3DTranslate(layer.transform, 50, 50, 0);

<2>缩放:同平移,在x,y设置值有效果,在z轴没有效果

layer.transform = CATransform3DScale(layer.transform, 0.5, 0.5, 0);

<3>旋转:旋转操作与在x,y,z设置参数值,根据三个值确定一个点(a)(x,y,z),然后从这个点a,至坐标原点(0,0,0),连成一条直线,然后layer就绕着这条直线进行旋转=

layer.transform = CATransform3DRotate(layer.transform, M_PI_4, 0, 0, 1);(这个是围绕z轴旋转45°)

 

2.4 手动创建CALayer

手动创建CALayer的时候,可以设置frame,也可以设置bounds,然后设置position;

在创建UIView的时候,如果设置了bounds,在设置位置的时候就需要用center,UIView里面没有position这个属性。

 

2.5 隐式动画

<1>每一个UIView内部都默认关联着一个CALayer,称这个Layer为RootLayer(根层);

所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画。
 
当对非RootLayer的部分属性进行修改时,默认会产生一些动画效果,这些属性称为Animatable Properties(可动画属性)
常见的Animatable Properties:

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

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

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

<2>关闭隐式动画

[CATransaction begin];

[CATransaction setDisableActions:YES];

layer.position = CGPointMake(10, 10);    

[CATransaction commit];

 

posted @ 2016-08-29 15:59  简简单单0  阅读(249)  评论(0编辑  收藏  举报