010-CALayer(图层)

问题一:什么是CALayer(图层)?

简而言之:使UIView可以显示在屏幕上的功能属性,UIView之所以可以显示在屏幕上完全是因为UIView内部含有一个CALayer属性

•在iOS中,能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView

•UIView本身不具备显示的功能,之所以能显示完全是因为它内部的图层属性(具有显示功能)

•在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层

@property(nonatomic,readonly,retain) CALayer *layer;

•当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,将所有内容绘制在自己的图层上,绘图完毕后,系统将图层映射到屏幕上,于是就完成了UIView的显示

// view的完整显示过程
// 1. view.layer准备了一个Layer Graphics Context(图层类型的上下文)
// 2. 调用view.layer.delegate(view)的drawLayer:inContext:,并传入刚才准备好的上下文
// 3. view的drawLayer:inContext:方法内部又会调用view的drawRect:方法
// 4. view就可以在drawRect:方法中实现绘图代码, 所有东西最终都绘制到view.layer上面
// 5. 系统再将view.layer的内容拷贝到屏幕, 于是完成了view的显示

问题二:CALayer具有哪些属性?

九大属性:

•1.内容(比如设置为图片CGImageRef)

@property(retain) id contents;

•2.位置(默认指中点,具体由anchorPoint决定)

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

•3.宽度和高度

@property CGRect bounds;

•4.锚点(x,y的范围都是0-1),决定了自身视图在position的坐落点

@property CGPoint anchorPoint; // 称为“定位点”、“锚点” 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0, 0) 它的x、y取值范围都是0~1,默认值为(0.5, 0.5)

•5.背景颜色(CGColorRef类型)

@property CGColorRef backgroundColor;

•6.形变属性

@property CATransform3D transform;

•7.边框颜色(CGColorRef类型)

@property CGColorRef borderColor;

•8.边框宽度

@property CGFloat borderWidth;

•9.圆角半径

@property CGColorRef borderColor;

问题三:CALayer可以用来做什么呢?

•通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,比如:

Ø阴影

Ø圆角大小

Ø边框宽度和颜色

Ø… …

Ø代码示例:显示效果:

- (void)testView
{
    // 边框宽度
    self.purpleView.layer.borderWidth = 10;
    //    // 边框颜色
    self.purpleView.layer.borderColor = [UIColor blueColor].CGColor;
    // 圆角
    self.purpleView.layer.cornerRadius = 10;
    //    self.purpleView.layer.masksToBounds = YES; // 超出主层边框范围的内容都剪掉
    // 阴影颜色
    self.purpleView.layer.shadowColor = [UIColor blueColor].CGColor;
    // 阴影偏差
    self.purpleView.layer.shadowOffset = CGSizeMake(10, 10);
    // 阴影不透明度
    self.purpleView.layer.shadowOpacity = 0.5;
}

•还可以给图层添加动画,来实现一些比较炫酷的效果(见问题六)

ps:新建图层

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 新建图层
//    CALayer *layer = [[CALayer alloc] init];
    CALayer *layer = [CALayer layer];
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.position = CGPointMake(200, 200);
    layer.anchorPoint = CGPointMake(1, 1);
    layer.cornerRadius = 10;
    layer.masksToBounds = YES;
    layer.contents = (id)[UIImage imageNamed:@"lufy"].CGImage;
    [self.view.layer addSublayer:layer];
    // 新建图层
    //    CALayer *layer1 = [[CALayer alloc] init];
    CALayer *layer1 = [CALayer layer];
    layer1.backgroundColor = [UIColor redColor].CGColor;
    layer1.bounds = CGRectMake(0, 0, 100, 100);
    layer1.position = CGPointMake(200, 200);
    layer1.anchorPoint = CGPointMake(0, 0);
    layer1.cornerRadius = 10;
    layer1.masksToBounds = YES;
    layer1.contents = (id)[UIImage imageNamed:@"lufy"].CGImage;
    [self.view.layer addSublayer:layer1];
}

新建图层

ps:自定义图层

@implementation WHBLayer
/**
 *  只有明显地调用setNeedsDisplay方法,才会调用drawInContext:方法进行绘制
 */
- (void)drawInContext:(CGContextRef)ctx
{
    // 红色
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
    // 添加圆
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));
    // 实心绘制
    CGContextFillPath(ctx);
}

WHBLayer.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    WHBLayer *layer = [WHBLayer layer];
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.backgroundColor = [UIColor greenColor].CGColor;
    layer.anchorPoint = CGPointZero;
    [layer setNeedsDisplay]; // 绘图 会自动调用WHBLayer的drawInContext:(CGContextRef)ctf 方法
    [self.view.layer addSublayer:layer];
}

ViewController.m

问题四:为什么在CALayer中我们使用CGImageRef、CGColorRef两种数据类型来对其设置,而不用UIColor、UIImage???

原因主要:考虑移植性,跨平台性

•QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用

  ØCALayer是定义在QuartzCore框架中的

  ØCGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的

•但是UIKit只能在iOS中使用

  ØUIColor、UIImage是定义在UIKit框架中的

•为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

问题五:既然UIView和CALayer均可在屏幕上显示图像,那又如何在二者之间做选择?

•通过CALayer,就能做出跟UIImageView一样的界面效果

•既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?

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

Ø如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以

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

问题六:如何利用CALayer来产生一些动画效果?什么是隐式动画?

•所有手动创建的CALayer对象,都存在着隐式动画

•什么是隐式动画?

Ø当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,称这些属性为Animatable Properties(可动画属性)

•列举几个常见的Animatable Properties:

// bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
// backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
// position:用于设置CALayer的位置。修改这个属性会产生平移动画

•可以通过动画事务(CATransaction)关闭默认的隐式动画效果

[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];

代码示例:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    CALayer *layer = [CALayer layer];
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.position = CGPointZero;
    layer.anchorPoint = CGPointZero;
    [self.view.layer addSublayer:layer];
    self.layer = layer;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.layer.backgroundColor = [UIColor blueColor].CGColor;
//    [CATransaction begin]; // 开启事务
//    [CATransaction setDisableActions:YES];

    self.layer.position = CGPointMake(100, 100);
    self.layer.opacity = 0.1;

//    [CATransaction commit]; // 提交事务
}

隐式动画

时间: 2024-10-15 14:12:02

010-CALayer(图层)的相关文章

iOS开发 - CALayer图层

CALayer的基本使用 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需要显示到屏幕上

CALayer图层的基本介绍

掌握 ● CALayer的基本属性 ● CALayer和UIView的关系 ● position和anchorPoint的作?用 CALayer ● 在iOS中,你能看得见摸得着的东西基本上都是UIView,?比如?一个按钮.?一个?文本标签.?一 个?文本输?入框.?一个图标等等,这些都是UIView ● 其实UIView之所以能显?示在屏幕上,完全是因为它内部的?一个图层 ● 在创建UIView对象时,UIView内部会?自动创建?一个图层(即CALayer对象),通过UIView 的lay

【iOS开发-90】CALayer图层:自己定义图层,图层的一些动画

(1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261547 (3)总结 --能够自己定义图层,尤其须要对图片进行圆角裁剪. --图层的动画都是假象,事实上属性根本没有变化.虽然用例如以下代码,但也仅仅是强制让图层停留在最后的地方,实际属性还是没有变. anim.fillMode=kCAFillModeForwards; anim.removedOnCompletion=NO; --尽量使用UIView的动画.少用CALayer的动画

[iOS Animation]-CALayer 图层几何学

图层几何学 不熟悉几何学的人就不要来这里了 --柏拉图学院入口的签名 在第二章里面,我们介绍了图层背后的图片,和一些控制图层坐标和旋转的属性.在这一章中,我们将要看一看图层内部是如何根据父图层和兄弟图层来控制位置和尺寸的.另外我们也会涉及如何管理图层的几何结构,以及它是如何被自动调整和自动布局影响的. 布局 UIView有三个比较重要的布局属性:frame,bounds和center,CALayer对应地叫做frame,bounds和position.为了能清楚区分,图层用了"position&

[iOS Animation]-CALayer 图层性能

图层性能 要更快性能,也要做对正确的事情. ——Stephen R. Covey 在第14章『图像IO』讨论如何高效地载入和显示图像,通过视图来避免可能引起动画帧率下降的性能问题.在最后一章,我们将着重图层树本身,以发掘最好的性能. 隐式绘制 寄宿图可以通过Core Graphics直接绘制,也可以直接载入一个图片文件并赋值给contents属性,或事先绘制一个屏幕之外的CGContext上下文.在之前的两章中我们讨论了这些场景下的优化.但是除了常见的显式创建寄宿图,你也可以通过以下三种方式创建

iOS高级-QuartzCore框架-CALayer图层

掌握CALayer的基本属性CALayer和UIView的关系position和anchorPoint的作用 CALayer CALayer的基本使用 CALayer的属性 //边框宽度(从Layer里面圈出一块出来作为边框)self.purpleView.layer.borderWidth = 10;//边框颜色self.purpleView.layer.borderColor = [UIColor redColor] .CGColor;//圆角self.purpleView.layer.co

[iOS Animation]-CALayer 图层树 二

图层的能力 如果说CALayer是UIView内部实现细节,那我们为什么要全面地了解它呢?苹果当然为我们提供了优美简洁的UIView接口,那么我们是否就没必要直接去处理Core Animation的细节了呢? 某种意义上说的确是这样,对一些简单的需求来说,我们确实没必要处理CALayer,因为苹果已经通过UIView的高级API间接地使得动画变得很简单. 但是这种简单会不可避免地带来一些灵活上的缺陷.如果你略微想在底层做一些改变,或者使用一些苹果没有在UIView上实现的接口功能,这时除了介入C

[iOS Animation]-CALayer 图层树

图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只是Core Animation特性的冰山一角. Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中.于是这个树形成了UIKit以及在iOS应用

【iOS开发-90】CALayer图层:自定义图层,图层的一些动画

(1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261547 (3)总结 --可以自定义图层,尤其需要对图片进行圆角裁剪. --图层的动画都是假象,其实属性根本没有变化,尽管用如下代码,但也只是强制让图层停留在最后的地方,实际属性还是没有变. anim.fillMode=kCAFillModeForwards; anim.removedOnCompletion=NO; --尽量使用UIView的动画,少用CALayer的动画.

CALayer 图层

// CALayer 图层属性,继承UIView都有该属性,可设置边框宽度.颜色.圆角.阴影等 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 150)]; imageView.image = [UIImage imageNamed:@"test.jpg"]; // 边框宽度.颜色 imageView.layer.borderWidth = 5; imageView