一、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:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor; //设置中心点 layer.position=CGPointMake(size.width/2, size.height/2); //设置大小 layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH); //设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形 layer.cornerRadius=WIDTH/2; //设置阴影 layer.shadowColor=[UIColor grayColor].CGColor; layer.shadowOffset=CGSizeMake(2, 2); layer.shadowOpacity=.9; //设置边框 // 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*4; }else{ width=WIDTH; } layer.bounds=CGRectMake(0, 0, width, width); layer.position=[touch locationInView:self.view]; layer.cornerRadius=width/2; }

七、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(0, 0, PHOTO_HEIGHT, PHOTO_HEIGHT); layer.position=CGPointMake(160, 200); layer.backgroundColor=[UIColor redColor].CGColor; layer.cornerRadius=PHOTO_HEIGHT/2; //注意仅仅设置圆角,对于图形而言可以正常显示,但是对于图层中绘制的图片无法正确显示 //如果想要正确显示则必须设置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=2; //设置图层代理 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, 1, -1); CGContextTranslateCTM(ctx, 0, -PHOTO_HEIGHT); UIImage *image=[UIImage imageNamed:@"001.png"]; //注意这个位置是相对于图层而言的不是屏幕 CGContextDrawImage(ctx, CGRectMake(0, 0, 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, 1); CGContextSetRGBStrokeColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, 1); // 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(0, 0, 185, 185); layer.position=CGPointMake(160,284); layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor; //显示图层 [layer setNeedsDisplay]; [self.view.layer addSublayer:layer]; }

转载于:https://www.cnblogs.com/chenweb/p/7108715.html

CALayer的属性和使用相关推荐

  1. IOS CALayer的属性和使用

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

  2. 文字与图片渐变效果(图层CALayer与属性蒙版mask )

    首先,我们需要稍微理清一下CAGradientLayer.CALayer,UIView和mask的大概关系. 在iOS中,能看得见摸的着的基本都是UIView,如按钮.图片等.UIView之所以能看得 ...

  3. CALayer mask属性实现蒙板效果

    相信很多人在ios上实现控件圆角的时候都用过:cornerRadius这个属性,例如实现圆形头像,一般我会这么写: self.headImageView.layer.masksToBounds = Y ...

  4. iOS开发之CALayer

    1.概述 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIView之所以能显示在屏幕上,完全是因为它内 ...

  5. iOS - UIView属性hidden, opaque, alpha, opacity的区别

    iOS开发-之UIView属性hidden, opaque, alpha, opacity的区别 一.alpha 液晶显示器是由一个个的像素点组成的,每个像素点都可以显示一个由RGBA颜色空间组成的一 ...

  6. UIView和CALayer是啥关系

    1. 首先UIView可以响应事件,Layer不可以. UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理.在 UIResponder中定义了处理各种事件和事件传递的 ...

  7. iOS 动画原理与实现--帧动画、逐帧动画、CALayer

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能"动"的画. 人的眼睛对图像有短暂的记 ...

  8. ios开发之View属性hidden, opaque, alpha, opacity的区别

    发表于2016/5/6 11:52:47  472人阅读 分类: iOS 一.alpha 液晶显示器是由一个个的像素点组成的,每个像素点都可以显示一个由RGBA颜色空间组成的一种色值.其中的A就表示透 ...

  9. iOS CALayer动画原理分析

    一.引出问题 在开始分析原理之前,我们先来看一个问题: 我们都知道 UIView与 CALayer之间的关系,通俗的来说,UIView内部封装了一个 CALayer, 其中 CALayer负责展示UI ...

最新文章

  1. 产品经理多任务并行处理,如何管理提效?
  2. C语言 学生宿舍管理系统
  3. Hibernate Shards 数据的水平、垂直切割(一)- Hibernate测试环境
  4. ai快捷键常用表_遇到这些办公软件快捷键赶集收藏-mark 视频剪辑|办公软件...
  5. [剑指offer]面试题19:二叉树的镜像
  6. Linux/Unix下tar命令详解
  7. MyEclipse 6.5GA 下载 + 汉化方法
  8. OpenShift 4 - DevSecOps Workshop (Jenkins版)
  9. Spring中为什么要开启注解扫描
  10. centos7.5部署mysql cluster NDB总结
  11. 【剑指offer】Python、java,C++三种语言同时实现
  12. RBM算法模型应用在推荐系统 Python代码实现
  13. java pv uv_什么是pv和uv?
  14. 8.0服务器维护时间,魔兽世界8.0开服第一天遇紧急维护?网友:叫逆水寒还服务器...
  15. EasyPoi导出Excel实现标记颜色
  16. Resource体系
  17. WPF 海康威视网络摄像头回调方式实现断连提示,降低时延
  18. linux命令行怎么结束进程,linux结束进程命令
  19. LearnOpenGL笔记->入门->变换与坐标系统
  20. 将系统(deepin15.11)装进U盘里面,在任何电脑上即插即用,使用自己的系统

热门文章

  1. java quartz Scheduler 操作Trigger
  2. vue 过滤器 filter
  3. StereoPannerNode
  4. Java JavaBean
  5. scipy.stats
  6. python格式输出占四列左对齐_python – 打印字符串左对齐,固定宽度和后缀
  7. 在 ESXi 上配置 syslog (2003322)
  8. 初识 NGINX 服务网格
  9. Kubernetes学习总结(14)—— Kubernetes 实用命令总结
  10. Mysql学习总结(70)——MySQL 优化实施方案