CALayer精讲

CALayer精讲


CALayer包含在QuartzCore框架中,这是一个跨平台的框架,既可以用在iOS中又可以用在Mac OS X中。后面要学Core Animation就应该先学好Layer(层)。

我们看一下UIViewLayer之间的关系图(图片来源于网络):

image

我们知道,UIView有一个属性layer,这个是在视图创建时就会自动创建一个图层。想要呈现出来,就需要到Layer。层是可以放很多个子层的,也就可以实现多种多样的效果。

CALayer关键属性说明


// 与UIView的bounds类似的,获取或设置图层的大小
@property CGRect bounds;/* The position in the superlayer that the anchor point of the layer's* bounds rect is aligned to. Defaults to the zero point. Animatable. */
// 获取或设置在父图层中对齐位置,默认为(0,0),也就是左上角。
// 这个属性与UIView的center属性类似,不过在图层中使用的是position
// 这里关系到锚点,关于锚点在游戏世界里是非常关键的概念
// 支持隐式动画
@property CGPoint position;/* The Z component of the layer's position in its superlayer. Defaults* to zero. Animatable. */
// 层与层之间有上下层的关系,设置Z轴方向的值,可以指定哪个层在上,哪个层在下
// 支持隐式动画
@property CGFloat zPosition;/* Defines the anchor point of the layer's bounds rect, as a point in* normalized layer coordinates - '(0, 0)' is the bottom left corner of* the bounds rect, '(1, 1)' is the top right corner. Defaults to* '(0.5, 0.5)', i.e. the center of the bounds rect. Animatable. */
// 这个就是游戏中必须要懂的锚点,默认为(0.5, 0.5),也就是正中央。
// 关于锚点的知识,当年自学cocos2d-x的时候也困扰过我一段时间,这个有专门的文章讲解的
// 大家可以查一查相关专题讲解。因为这个确实不好理解,一时说不通。
// 支持隐式动画
@property CGPoint anchorPoint;/* A transform applied to the layer relative to the anchor point of its* bounds rect. Defaults to the identity transform. Animatable. */
// 图层形变,做动画常用
// 支持隐式动画
@property CATransform3D transform;

温馨提示:在CALayer中很少使用frame属性,因为frame本身不支持动画效果,通常使用boundsposition代替。CALayer中透明度使用opacity表示而不是alpha;中心点使用position表示而不是center

实战点击放大移动效果


先看看效果图:

image

实现代码逻辑:

#define kLayerWidth 50@interface HYBMoveCircleLayerController ()@property (nonatomic, strong) CALayer *movableCircleLayer;@end@implementation HYBMoveCircleLayerController- (void)viewDidLoad {[super viewDidLoad];self.movableCircleLayer = [CALayer layer];// 指定大小self.movableCircleLayer.bounds = CGRectMake(0, 0, kLayerWidth, kLayerWidth);// 指定中心点self.movableCircleLayer.position = self.view.center;// 变成圆形self.movableCircleLayer.cornerRadius = kLayerWidth / 2;// 指定背景色self.movableCircleLayer.backgroundColor = [UIColor blueColor].CGColor;// 设置阴影self.movableCircleLayer.shadowColor = [UIColor grayColor].CGColor;self.movableCircleLayer.shadowOffset = CGSizeMake(3, 3);self.movableCircleLayer.shadowOpacity = 0.8;[self.view.layer addSublayer:self.movableCircleLayer];
}- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {CGFloat width = kLayerWidth;if (self.movableCircleLayer.bounds.size.width <= kLayerWidth) {width = kLayerWidth * 2.5;}// 修改大小self.movableCircleLayer.bounds = CGRectMake(0, 0, width, width);// 将中心位置放到点击位置self.movableCircleLayer.position = [[touches anyObject] locationInView:self.view];// 再修改成圆形self.movableCircleLayer.cornerRadius = width / 2;
}@end

这里需要注意的是每次更新位置时,这个图层的大小和cornerRadius都需要更新,否则就不成圆形了!

通过层内容呈现图片


效果图片:

image

代码实现:

- (void)drawImageWithContent {CALayer *layer = [CALayer layer];layer.bounds = CGRectMake(0, 0, kPhotoWidth, kPhotoWidth);layer.position = self.view.center;layer.cornerRadius = kPhotoWidth / 2;// 要设置此属性才能裁剪成圆形,但是添加此属性后,下面设置的阴影就没有了。layer.masksToBounds = YES;layer.borderColor = [UIColor whiteColor].CGColor;layer.borderWidth = 1;// 如果只是显示图片,不做其它处理,直接设置contents就可以了,也就不会出现// 绘图和图像倒立的问题了layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"bb"].CGImage);[self.view.layer addSublayer:layer];
}

如果我们只是需要显示图片到图层上,通过设置contents属性就可以了,也就不用绘图,也不会出现图像倒立的问题了。

通过层代理绘制图片


上面的内容呈现是很简单的,但是如果我们要增加其它效果呢?那就需要别的方式了。如下效果图:

image

代码实现:

- (void)drawImage {CALayer *layer = [CALayer layer];layer.bounds = CGRectMake(0, 0, kPhotoWidth, kPhotoWidth);layer.position = self.view.center;layer.cornerRadius = kPhotoWidth / 2;// 要设置此属性才能裁剪成圆形,但是添加此属性后,下面设置的阴影就没有了。layer.masksToBounds = YES;layer.borderColor = [UIColor whiteColor].CGColor;layer.borderWidth = 1;//  // 阴影
//  layer.shadowColor = [UIColor blueColor].CGColor;
//  layer.shadowOffset = CGSizeMake(4, 4);
//  layer.shadowOpacity = 0.9;// 指定代理layer.delegate = self;// 添加到父图层上[self.view.layer addSublayer:layer];// 当设置masksToBounds为YES后,要想要阴影效果,就需要额外添加一个图层作为阴影图层了CALayer *shadowLayer = [CALayer layer];shadowLayer.position = layer.position;shadowLayer.bounds = layer.bounds;shadowLayer.cornerRadius = layer.cornerRadius;shadowLayer.shadowOpacity = 1.0;shadowLayer.shadowColor = [UIColor redColor].CGColor;shadowLayer.shadowOffset = CGSizeMake(2, 1);shadowLayer.borderWidth = layer.borderWidth;shadowLayer.borderColor = [UIColor whiteColor].CGColor;[self.view.layer insertSublayer:shadowLayer below:layer];// 调用此方法,否则代理不会调用[layer setNeedsDisplay];
}#pragma mark - CALayerDelegate
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {// 将当前上下文入栈CGContextSaveGState(ctx);// 注意:坐标系统与UIView的不同,这里使用的是笛卡尔积坐标系,也就是左下角为(0,0)// 所以,我们只要记住这点就可以很容易地变换了。// 处理图片倒立的问题// 默认呈现是倒立的,因此需要将形变矩阵的sy设置为-1就成了正立的了// 先缩放后平移也可以
// CGContextScaleCTM(ctx, 1, -1);
// CGContextTranslateCTM(ctx, 0, -kPhotoWidth);// 先向平移后旋转也可以解决倒立的问题CGContextTranslateCTM(ctx, kPhotoWidth, kPhotoWidth);CGContextRotateCTM(ctx, 3.1415926 / 180 * 180);UIImage *image = [UIImage imageNamed:@"bb"];CGContextDrawImage(ctx, CGRectMake(0, 0, kPhotoWidth, kPhotoWidth), image.CGImage);// 任务完成后,将当前上下文退栈CGContextRestoreGState(ctx);
}

我们需要注意,一旦设置了层的layer.masksToBoundsYES,那么阴影效果就没有了,也就是不能直接对该层设置shadow相关的属性了,设置了也没有作用。因此,这里使用另外一个图层来专门呈现阴影效果的。

我们需要将阴影层放在图片层的下面,别把图片层给挡住了。默认是不会调用代理方法的,必须要调用setNeedsDisplay方法才会回调。因此,要绘制哪个层就调用哪个层对象调用该方法。

在代理方法中,我们介绍一下相关代码。CGContextSaveGState方法是入栈操作,也就是将当前设备上下文入栈。既然有入栈,自然也得有出栈,最后一行CGContextRestoreGState就是将设备上下文出栈。我们必须明确一点,绘图是在设备上下文上操作的,因此,我们所进行的绘图操作都会是栈顶元素上的。

矩阵操作:通过CGContextDrawImage绘制的图片是倒立的,因此我们需要进行矩阵相关变换。关于矩阵变换的知识是数学知识,也是知识难点,关于此理论知识,大家可以阅读:http://www.tuicool.com/articles/Er6VNf6

我们需要明确坐标系为笛卡尔积坐标系,坐标原点在左下角。这里提供了两种解决图像倒立问题的方法。

  • 第一种:先绽放后平移
  • 第二种:先平移后旋转

对于第一种,我们先设置矩阵的sx,sy分别为1,-1,然后平移到(0, -kPhotoWidth)。对于这一种不好理解,因此,笔者提供了第二种方法,更容易理解一些。

第二种,先平移到右上角,然后再旋转180度,正好正立。

网络上的一张图片:

image

坐标原点在左下角,我们将倒立的图片先平移到右上角,再顺时针旋转180度正好形成正立。

源代码


小伙伴们可以到github下载源代码哦:https://github.com/CoderJackyHuang/CALayerDemo

阅读原文

关注我


微信公众号:iOSDevShares
有问必答QQ群:324400294

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rofl用什么播放_ROFL的完整形式是什么?

rofl用什么播放ROFL&#xff1a;笑在地板上滚动 (ROFL: Rolling On Floor Laughing) ROFL is an abbreviation of Rolling on Floor Laughing. ROFL is a very trendy internet slang between youngsters and used in text messaging, instant messaging, chatting, and social…

gif 格式 完整 检查_GIF的完整格式是什么?

gif 格式 完整 检查GIF&#xff1a;图形交换格式 (GIF: Graphics Interchange Format) GIF is an abbreviation of Graphics Interchange Format. It is extensively used for animations and still images on the World Wide Web. The image is set out is bitmap image and i…

Java基础_05

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff1a;boolean运算符号 || 与 | && 与 &的区别。 Equals与innstanceof 1&#xff1a;java中的方法。方法的定义&#xff0c;参数、返回值、调用方式。 2&#xff1a;方法调用与参数传递、Static方…

Android Studio 之下载安装

2019独角兽企业重金招聘Python工程师标准>>> 目录[-] 背景Android Studio VS Eclipse下载创建HelloWorld项目背景 相信大家对Android Studio已经不陌生了&#xff0c;Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具&#xff0c;目前很多开…

模拟UIWebView

2019独角兽企业重金招聘Python工程师标准>>> // // ViewController.m // 模拟UIWebView // // Created by dc0061 on 15/12/10. // Copyright © 2015年 dc0061. All rights reserved. //#import "ViewController.h"interface ViewController ()&…

4g 中bis代表什么_BIS的完整形式是什么?

4g 中bis代表什么BIS&#xff1a;印度标准局 (BIS: Bureau of Indian Standards) BIS is an abbreviation of the Bureau of Indian Standards. It is the National Standard Body of India which is operating in the groundwork and execution of the standards, certificati…

Feature selection

原文:http://scikit-learn.org/stable/modules/feature_selection.html The classes in the sklearn.feature_selection module can be used for feature selection/dimensionality reduction on sample sets, either to improve estimators’ accuracy scores or to boost the…

ronald aai_AAI的完整形式是什么?

ronald aaiAAI&#xff1a;印度机场管理局 (AAI: Airport Authority of India) AAI is an abbreviation of the Airport Authority of India. It operates under the Ministry of Civil Aviation. It is in charge of creating, crafting, maintaining and enhancing the civil…

使用Eclipse-Maven-git做Java开发(13)--导入git仓库的代码到eclipse

2019独角兽企业重金招聘Python工程师标准>>> 前面讲到了怎么使用osc的git服务进行代码托管。至此&#xff0c;我们已经可以使用git进行文件的版本管理了&#xff0c;甚至可以进行不需要IDE的编程了&#xff0c;但是我们绝大多数时候还是需要IDE的&#xff0c;接下来…

python 三维图直方图_Python | 阶梯直方图

python 三维图直方图A histogram is a graphical technique or a type of data representation using bars of different heights such that each bar groups numbers into ranges (bins or buckets). Taller the bar higher the data falls in that bin. A Histogram is one o…

ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

运行效果&#xff1a; 此文介绍了根据操作左侧菜单在右面板展示相应内容。 一、主页 先看一下跳转主页的方式&#xff1a;由在webapp根目录下的index.jsp跳转至demo的index.jsp 下面是demo的index.jsp的代码 <% page language"java" contentType"text/html; …

jQuery之call()方法的使用

最近在做项目时候&#xff0c;写了几行关于DOM操作的代码&#xff0c;在方法中使用了this&#xff0c;在后期重构的时候&#xff0c;想将这段分离出来做成一个方法。 最开始想的很简单&#xff0c;就直接分离出来使用方法名称调用即可。 但是实际操作的时候没有效果&#xff0c…

github的使用

GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化git仓库 :git init ; -- 提交改变到缓存 :git commit -m description ; -- 本地git仓库关联GitHub仓库 : g…

sql更改完整模式报错_SQL的完整形式是什么?

sql更改完整模式报错SQL&#xff1a;结构化查询语言 (SQL: Structured Query Language) SQL is an abbreviation of Structured Query Language. It is a programming language developed and designed for handling structured data in Relational Database Management System…

基于微服务架构,改造企业核心系统之实践

2019独角兽企业重金招聘Python工程师标准>>> 1. 背景与挑战 随着公司国际化战略的推行以及本土业务的高速发展&#xff0c;后台支撑系统已经不堪重负。在吞吐量、稳定性以及可扩展性上都无法满足日益增长的业务需求。对于每10万元额度的合同&#xff0c;从销售团队…

bkg bnc_BNC的完整形式是什么?

bkg bncBNC&#xff1a;刺刀Neill–Concelman (BNC: Bayonet Neill–Concelman) BNC is an abbreviation of "Bayonet Neill–Concelman". BNC是“刺刀Neill–Concelman”的缩写 。 It is also known as "British Naval Connector" or "Bayonet Nut …

使用visio 提示此UML形状所在的绘图页不是UML模型图的一部分 请问这个问题怎么解决?...

解决方法新建->选择软件与数据库模板->选择UML模型图->注意&#xff1a;如果不选择UML模型图的话&#xff0c;可能会出现无法编辑形状文本&#xff0c;提示“此UML形状所在的绘图页不是UML模型图的一部分&#xff0c;该形状设计用于利用UML模型图模板创建的绘图”关注…

tgc 什么意思 tgt_TGT的完整形式是什么?

tgc 什么意思 tgtTGT&#xff1a;训练有素的研究生老师 (TGT: Trained Graduate Teacher) TGT is an abbreviation of Trained Graduate Teacher. It is a title, not a teaching program that is given to a graduate person who has done completion of training in teaching…

svn的使用(Mac)

2019独角兽企业重金招聘Python工程师标准>>> 从服务器下载代码 在终端中输入svn checkout svn://localhost/mycode --username用户名 --password密码 /Users/apple/Documents/code指令意思&#xff1a;将服务器中mycode仓库的内容下载到/Users/apple/Documents/myCo…

css 中文文字字体_使用CSS的网络字体

css 中文文字字体CSS | 网络字体 (CSS | Web fonts) Web fonts allow people to use fonts that are not pre-installed in their computers. When you want to include a particular font simply include the font file on your browser and it will be downloaded. Web字体允…