一、CALayer的常用属性

  • 1、@propertyCGPoint position; 
    图层中心点的位置,类似与UIView的center;用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0);

  • 2、 @property CGPoint anchorPoint; 
    称『定位点』、『锚点』,该描述是相对于x、y位置比例而言的默认在图像中心点(0.5、0.5)的位置;决定着CALayer身上的哪个点会再position属性所指的位置,以自己的左上角为原点(0,0);它的x、y取值范围都是0~1。

  • 3、 @property(nullable) CGColorRef backgroundColor; 
    图层背景颜色

  • 4、 @property(nullable) CGColorRef borderColor; 
    图层边框颜色

  • 5、 @property CGFloat borderWidth; 
    图层边框宽度

  • 6、 @property CGRect bounds; 
    图层大小

  • 7、 @property(nullable, strong) id contents; 
    图层显示内容,例如可以将图片作为图层内容显示

  • 8、 @property CGRect contentsRect; 
    图层显示内容的大小和位置

  • 9、 @property CGFloat cornerRadius; 
    圆角半径

  • 10、 @property(getter=isDoubleSided) BOOL doubleSided; 
    图层背景是否显示,默认是YES

  • 11、 @property CGRect frame; 
    图层大小和位置,不支持隐式动画,所以CALyaer中很少使用frame,通常使用bound和position代替

  • 12、 @property(getter=isHidden) BOOL hidden; 
    是否隐藏

  • 13、 @property(nullable, strong) CALayer *mask; 
    图层蒙版

  • 14、 @property BOOL masksToBounds; 
    子图层是否剪切图层边界,默认是NO

  • 15、 @property float opacity; 
    图层透明度,类似与UIView的alpha

  • 16、 @property(nullable) CGColorRef shadowColor; 
    阴影颜色

  • 17、 @property CGSize shadowOffset; 
    阴影偏移量

  • 18、 @property float shadowOpacity; 
    阴影透明度,注意默认为0,如果设置阴影必须设置此属性

  • 19、 @property(nullable) CGPathRef shadowPath; 
    阴影形状

  • 20、 @property CGFloat shadowRadius; 
    阴影模糊半径

  • 21、 @property(nullable, copy) NSArray

二、CALayer不常用属性

  • 1、 @property CGFloat zPosition; 
    图层中心点在z轴中的位置

  • 2、 @property CGFloat anchorPointZ; 
    图层在z轴中的锚点;

  • 3、 - (CGAffineTransform)affineTransform;

  • 4、- (void)setAffineTransform:(CGAffineTransform)m; 
    以上属性为图层形变;该属性值指定一个CGAffineTransform对象,该对象代表对CALayer执行X、Y两个维度(也就是平面)上的旋转、缩放、位移、斜切、镜像等变换矩阵

  • 5、 @property(nullable, readonly) CALayer *superlayer; 
    图层的父图层

三、CALayer图层操作

  • 1、 - (void)addSublayer:(CALayer *)layer; 
    添加子图层

  • 2、 - (void)removeFromSuperlayer; 
    将自己从父图层中移除

  • 3、 - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx; 
    在自己子图层数组中的第idx位置添加图层

  • 4、 - (void)insertSublayer:(CALayer )layer below:(nullable CALayer )sibling; 
    将图层layer添加在子图层sibling的下面

  • 5、 - (void)insertSublayer:(CALayer )layer above:(nullable CALayer )sibling; 
    将图层layer添加在子图层sibling的上面

  • 6、 - (void)replaceSublayer:(CALayer )layer with:(CALayer )layer2; 
    将图层layer替换layer2;

四、CALayer动画操作

  • 1、 - (void)addAnimation:(CAAnimation )anim forKey:(nullable NSString )key; 
    图层添加某一属性的动画

  • 2、 - (nullable NSArray< NSString )animationKeys; 
    获取所有动画的属性

  • 3、 - (nullable CAAnimation )animationForKey:(NSString )key; 
    获取某一属性的动画

  • 4、 - (void)removeAnimationForKey:(NSString *)key; 
    移除某一属性动画

  • 5、 - (void)removeAllAnimations; 
    移除所有动画

五、隐式动画

ios中CALayer的设计主要是为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为『隐式动画属性』。但是对于UIView的根视图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的作用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全有iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。

    • 1、如何查看CALayer的某个属性是否支持隐式动画

      • 可以查看头文件,看有没有Animatable,如果有表示支持; 
      • 查看官方文档
      • 下面标明都支持隐式动画
    • 2、例子

#pragma mark 绘制图层
-(void)drawMyLayer{
CGSize size=[UIScreen mainScreen].bounds.size;
//获得根图层
layer=[[CALayer alloc]init];
//设置背景颜色,由于QuartzCore是跨平台框架,无法直接使用UIColor
layer.backgroundColor=[UIColor colorWithRed: green:/255.0 blue:1.0 alpha:1.0].CGColor;
//设置中心点
layer.position=CGPointMake(size.width/, size.height/);
//设置大小
layer.bounds=CGRectMake(, , WIDTH,WIDTH);
//设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形
layer.cornerRadius=WIDTH/;
//设置阴影
layer.shadowColor=[UIColor grayColor].CGColor;
layer.shadowOffset=CGSizeMake(, );
layer.shadowOpacity=.;
//设置边框
// layer.borderColor=[UIColor whiteColor].CGColor;
// layer.borderWidth=1;
//设置锚点
// layer.anchorPoint=CGPointZero;
[self.view.layer addSublayer:layer];
}
#pragma mark 点击放大
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
CGFloat width=layer.bounds.size.width;
if (width==WIDTH) {
width=WIDTH*;
}else{
width=WIDTH;
}
layer.bounds=CGRectMake(, , width, width);
layer.position=[touch locationInView:self.view];
layer.cornerRadius=width/;
}

七、CALayer绘图

使用Quartz 2D绘图,是直接调用UIView的drawRect:方法绘制图形、图像,这种方式的本质还是再图层中绘制。drawRect:方法是由UIKit组件进行调用,因此厘米那可以使用到一些UIKir封装的方法进行绘制,而直接绘制到图层的方法由于并非UIKit直接调用因此只能用原生的Core Graphics方法绘制; 
图层绘制有两种方法,不管使用那种方法绘制完必须调用图层的setNeedDisplay方法,下面介绍图层的两种绘制方法:

(1)、通过图层代理drawLayer:inContext:方法绘制

通过代理方法进行图层呢个绘制只要指定图层的代理,然后在代理对象中重写 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意这个方法虽然是代理方法但是不用手动实习那CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的 - (void)setNeedsDisplay;方法,否测绘制内容无法显示; 
例如:

#pragma mark 绘制图层
-(void)drawMyLayer{
//自定义图层
CALayer *layer=[[CALayer alloc]init];
layer.bounds=CGRectMake(, , PHOTO_HEIGHT, PHOTO_HEIGHT);
layer.position=CGPointMake(, );
layer.backgroundColor=[UIColor redColor].CGColor;
layer.cornerRadius=PHOTO_HEIGHT/;
//注意仅仅设置圆角,对于图形而言可以正常显示,但是对于图层中绘制的图片无法正确显示
//如果想要正确显示则必须设置masksToBounds=YES,剪切子图层
layer.masksToBounds=YES;
//阴影效果无法和masksToBounds同时使用,因为masksToBounds的目的就是剪切外边框,
//而阴影效果刚好在外边框
// layer.shadowColor=[UIColor grayColor].CGColor;
// layer.shadowOffset=CGSizeMake(2, 2);
// layer.shadowOpacity=1;
//设置边框
layer.borderColor=[UIColor whiteColor].CGColor;
layer.borderWidth=;
//设置图层代理
layer.delegate=self;
//添加图层到根图层
[self.view.layer addSublayer:layer];
//调用图层setNeedDisplay,否则代理方法不会被调用
[layer setNeedsDisplay];
}
#pragma mark 绘制图形、图像到图层,注意参数中的ctx是图层的图形上下文,其中绘图位置也是相对图层而言的
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
// NSLog(@"%@",layer);//这个图层正是上面定义的图层
CGContextSaveGState(ctx);
//图形上下文形变,解决图片倒立的问题
CGContextScaleCTM(ctx, , -);
CGContextTranslateCTM(ctx, , -PHOTO_HEIGHT);
UIImage *image=[UIImage imageNamed:@"001.png"];
//注意这个位置是相对于图层而言的不是屏幕
CGContextDrawImage(ctx, CGRectMake(, , PHOTO_HEIGHT, PHOTO_HEIGHT), image.CGImage);
// CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));
// CGContextDrawPath(ctx, kCGPathFillStroke);
CGContextRestoreGState(ctx);
}

(2)、使用自定义图层绘图

在自定义图层绘图时只要自己编写一个类继承与CALayer然后在 - (void)drawInContext:(CGContextRef)ctx;中绘图即可。同前面在代理方法绘图一样,要显示图层中绘制的内容也要调用图层的 - (void)setNeedsDisplay;方法,否则 - (void)drawInContext:(CGContextRef)ctx;方法将不会调用; 
例如:

KCALayer.h
#import "KCALayer.h" @implementation KCALayer
-(void)drawInContext:(CGContextRef)ctx{
NSLog(@"3-drawInContext:");
NSLog(@"CGContext:%@",ctx);
// CGContextRotateCTM(ctx, M_PI_4);
CGContextSetRGBFillColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, );
CGContextSetRGBStrokeColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, );
// CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));
// CGContextFillEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
CGContextMoveToPoint(ctx, 94.5, 33.5);
//// Star Drawing
CGContextAddLineToPoint(ctx,104.02, 47.39);
CGContextAddLineToPoint(ctx,120.18, 52.16);
CGContextAddLineToPoint(ctx,109.91, 65.51);
CGContextAddLineToPoint(ctx,110.37, 82.34);
CGContextAddLineToPoint(ctx,94.5, 76.7);
CGContextAddLineToPoint(ctx,78.63, 82.34);
CGContextAddLineToPoint(ctx,79.09, 65.51);
CGContextAddLineToPoint(ctx,68.82, 52.16);
CGContextAddLineToPoint(ctx,84.98, 47.39);
CGContextClosePath(ctx);
CGContextDrawPath(ctx, kCGPathFillStroke);
}
@end
ViewController.m
#pragma mark 绘制图层
-(void)drawMyLayer{
KCALayer *layer=[[KCALayer alloc]init];
layer.bounds=CGRectMake(, , , );
layer.position=CGPointMake(,);
layer.backgroundColor=[UIColor colorWithRed: green:/255.0 blue:1.0 alpha:1.0].CGColor;
//显示图层
[layer setNeedsDisplay];
[self.view.layer addSublayer:layer];
}

七、CALayer绘图

使用Quartz 2D绘图,是直接调用UIView的drawRect:方法绘制图形、图像,这种方式的本质还是再图层中绘制。drawRect:方法是由UIKit组件进行调用,因此厘米那可以使用到一些UIKir封装的方法进行绘制,而直接绘制到图层的方法由于并非UIKit直接调用因此只能用原生的Core Graphics方法绘制; 
图层绘制有两种方法,不管使用那种方法绘制完必须调用图层的setNeedDisplay方法,下面介绍图层的两种绘制方法:

(1)、通过图层代理drawLayer:inContext:方法绘制

通过代理方法进行图层呢个绘制只要指定图层的代理,然后在代理对象中重写 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意这个方法虽然是代理方法但是不用手动实习那CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的 - (void)setNeedsDisplay;方法,否测绘制内容无法显示; 
例如:

 

IOS CALayer的属性和使用的更多相关文章

  1. CALayer的属性和使用

    一.CALayer的常用属性 1.@propertyCGPoint position; 图层中心点的位置,类似与UIView的center:用来设置CALayer在父层中的位置:以父层的左上角为原点( ...

  2. [转]IOS UIView 之属性篇

    [转载自:IOS UIView 之属性篇 From CSDN] UIView 继承于UIResponder             所遵守的协议有 NSCoding .UIAppearance. UI ...

  3. iOS CALayer使用

    CALayer使用 iOS的设备中,我们之所以能看到各种各样的控件.文字.图片,都是Core Animation框架的功劳.它通过图层的合成,最终显示在屏幕上.而今天这篇文章讲的就是Core Anim ...

  4. iOS开发-automaticallyAdjustsScrollViewInsets属性

    iOS开发-automaticallyAdjustsScrollViewInsets属性 Available in iOS 7.0 and later. 简单点说就是automaticallyAdju ...

  5. IOS UITableView NSIndexPath属性讲解

    IOS UITableView NSIndexPath属性讲解   查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和deleg ...

  6. IOS学习5——属性与成员变量

    [转]iOS中属性与成员变量的区别 ios中属性修饰符的作用 1. 属性用property声明 2. 简而言之,对于目前的ios开发,属性和成员变量的区别,完全可以不管. 3. 这个是历史原因造成的. ...

  7. IOS CALayer基本使用 (图层)

    ● 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层(CALayer) ● 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView 的l ...

  8. iOS Category 添加属性实现原理 - 关联对象

    iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...

  9. iOS Core Animation学习总结(1)--CALayer常用属性

    图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...

随机推荐

  1. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  2. HihoCoder - 1445 后缀自动机 试水题

    题意:求子串个数 SAM中每个子串包含于某一个状态中 对于不同的状态\(u,v\),\(sub(u)∩sub(v)=NULL\) 因此答案就是对于所有的状态\(st\),\(ans=\sum_{st} ...

  3. 【App性能】:TraceView分析法

    抓取traceview的日志有两种方式, 1,是在代码中片段中添加: Debug.startMethodTracing(“hello”); ....... Debug.stopMethodTracin ...

  4. 【转载】TableLayout表格布局详解

    原文地址:http://www.cnblogs.com/manuosex/p/3584701.html 一.Tablelayout简介 Tablelayout类以行和列的形式对控件进行管理,每一行为一 ...

  5. Docker 拷贝文件

    1.从容器里面拷文件到宿主机? 答:在宿主机里面执行以下命令 docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 示例: 假设容器名为testtomcat, ...

  6. windows7用WMware安装Linux虚拟机详细步骤

    一.安装环境 windows7操作系统物理机VMware Workstation 软件(可以在网上下载)CentOS6.5镜像文件(其他版本都大同小异,这里以CentOS6.5为例)Cnetos6.5 ...

  7. js继承的实现(es5)

    js对面向对象的支持很弱,所以在ES6之前实现继承会绕比较多的弯(类似于对面向对象支持弱,然后强行拼凑面向对象的特性) es5中实现继承的几种方式,父类定义为Super function Super( ...

  8. ECharts概念学习系列之ECharts的下载和安装(图文详解)

    不多说,直接上干货! http://echarts.baidu.com/download.html 前言 如果你想要用较少的代码实现比较酷炫的数据统计表,echarts是值得你考虑的一种实现方式.官网 ...

  9. exe4j生成的exe反编译成java代码

    很早以前写了一个java串口小程序,现在只有exe4j打包后的源程序了,最近又要用,折腾了一下发现其实要找回来也很简单,这里记录一下,以免以后忘记. exe4j只是将java程序,使用自己的方式打包了 ...

  10. python-Lock进程同步解决互斥

    #!/usr/bin/python from multiprocessing import Process,Lock import time,sys def A(lock): with lock: f ...