认识CALayer

/*

CALayer: 负责视图中显示的内容和动画

UIView: 负责监听和响应事件

没有CALayer, UIView就不能显示东西

也就是说UIView不具备显示的功能, CALayer才有.

下面是CALayer的一些基本用法

*/

/*

01 - UIView图层

标明: 我的_blueView是拖入的控件, 在sb中

*/

 1 // ------------------- 阴影 -------------------
 2     // 阴影颜色
 3     _blueView.layer.shadowColor = [UIColor redColor].CGColor;
 4
 5     // 阴影不透明度, 默认透明0, 不透明1
 6     _blueView.layer.shadowOpacity = 1;
 7
 8     // 阴影偏移
 9     _blueView.layer.shadowOffset = CGSizeMake(0, 0);
10
11     // 阴影半径
12     _blueView.layer.shadowRadius = 50;
13
14
15     // ------------------- 圆角 -------------------
16     _blueView.layer.cornerRadius = 50;
17
18     // ------------------- 边框 -------------------
19     // 边框颜色
20     _blueView.layer.borderColor = [UIColor whiteColor].CGColor;
21
22     // 边框宽度
23     _blueView.layer.borderWidth = 2;

/*

02 - UIImageView图层和UIView图层的用法基本上是一样的

标注: _imageView为拖入的控件, 在sb中

*/

 1 _imageView.layer.cornerRadius = 50;
 2
 3     // 必须设置这个属性, 图片才会被裁剪
 4     _imageView.layer.masksToBounds = YES;
 5
 6     _imageView.layer.borderWidth = 2;
 7     _imageView.layer.borderColor = [UIColor redColor].CGColor;
 8
 9     // 打印这个是为了证明图片放到了layer的contens上
10     NSLog(@"%@, %@", _imageView.layer.sublayers, _imageView.layer.contents);

/*

03 - 自定义图层

*/

 1 // 创建一个图层
 2     CALayer * layer = [CALayer layer];
 3
 4     // 设置位置
 5     layer.position = CGPointMake(300, 100);
 6
 7     // 设置大小
 8     layer.bounds = CGRectMake(0, 0, 100, 100);
 9
10     // 设置颜色
11     layer.backgroundColor = [UIColor blueColor].CGColor;
12
13     // 设置内容
14 //    layer.contents = CFBridgingRelease([UIImage imageNamed:@"阿狸头像"].CGImage);
15     layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage;
16
17     // 添加图层
18     [self.view.layer addSublayer:layer];

/*

04 - 位置和锚点

position(位置): 它决定着视图在什么位置

anchorPoint(锚点): 它决定着视图上的哪个点在position上

*/

 1 CALayer * blueLayer = [CALayer layer];
 2     blueLayer.position = CGPointMake(0, 0);
 3     blueLayer.bounds = CGRectMake(0, 0, 200, 200);
 4
 5     // 设置锚点位置为(0, 0), 这样整个层才能在屏幕上完全的显现出来
 6     blueLayer.anchorPoint = CGPointMake(0, 0);
 7     blueLayer.backgroundColor = [UIColor blueColor].CGColor;
 8     [self.view.layer addSublayer:blueLayer];
 9
10     CALayer * redlayer = [CALayer layer];
11     redlayer.position = CGPointMake(200, 200);
12     redlayer.bounds = CGRectMake(0, 0, 100, 100);
13
14     // 锚点取值([0, 1], [0, 1]), 默认为(0.5, 0.5)
15     redlayer.anchorPoint = CGPointMake(1, 0.5);
16     redlayer.backgroundColor = [UIColor redColor].CGColor;
17     [self.view.layer addSublayer:redlayer];

/*

05 - 隐式动画

当更改一些非根层的一些属性时, 默认会产生一些动画效果, 这就是隐式动画

如:

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

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

position: 用于设置CALayer的位置, 修改这个属性会产生平移动画.

*/

 1 // 创建图层
 2     CALayer * layer = [CALayer layer];
 3
 4     // 设置大小
 5     layer.bounds = CGRectMake(0, 0, 100, 100);
 6
 7     // 设置颜色
 8     layer.backgroundColor = [UIColor redColor].CGColor;
 9
10     // 添加图层
11     [self.view.layer addSublayer:layer];
12
13     _layer = layer;
14
15 // 当触摸屏幕时就会出现隐式动画
16 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
17
18     // 开启事务
19     [CATransaction begin];
20
21     // 取消隐式动画
22 //    [CATransaction setDisableActions:YES];
23     // 更改位置
24 //    _layer.position = CGPointMake(200, 200);
25
26     // 添加边框
27     CGFloat r = arc4random_uniform(256) / 255.0;
28     CGFloat g = arc4random_uniform(256) / 255.0;
29     CGFloat b = arc4random_uniform(256) / 255.0;
30 //    _layer.borderColor = [UIColor colorWithRed:r green:g blue:b alpha:1].CGColor;
31     _layer.borderWidth = arc4random_uniform(5) + 1;
32
33     // 更改背景色
34     _layer.backgroundColor = [UIColor colorWithRed:r green:g blue:b alpha:1].CGColor;
35
36     // 随点击移动
37     UITouch * touch = [touches anyObject];
38     CGPoint pos = [touch locationInView:self.view];
39     _layer.position = pos;
40
41     // 提交事务
42     [CATransaction commit];
43 }

/*

06 - 图层动画

*/

 1 // 触摸屏幕开始图层动画
 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
 3
 4     [UIView animateWithDuration:1 animations:^{
 5
 6         // 绽放
 7 //        _imageView.layer.transform = CATransform3DMakeScale(0.5, 0.5, 1);
 8 //        [_imageView.layer setValue:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)] forKeyPaht:@"transform"];
 9 //        [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
10
11         // 旋转
12 //        _imageView.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);
13 //        [_imageView.layer setValue:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)] forKeyPath:@"transform"];
14 //        [_imageView.layer setValue:@M_PI forKeyPath:@"transform.rotation"];
15
16         // 平移
17 //        _imageView.layer.transform = CATransform3DMakeTranslation(100, 100, 0);
18 //        [_imageView.layer setValue:[NSValue valueWithCGPoint:CGPointMake(100, 100)] forKeyPath:@"transform.translation"];
19         [_imageView.layer setValue:@100 forKeyPath:@"transform.translation.y"];
20
21     }];
22
23 }

注意点:

CALayer 和 UIView

通过CALayer可以做出和UIView一样的界面效果

UIView可以进行用户交互, 有事件处理的功能, 而CALayer没有.

但是CALayer更轻量级.

时间: 2024-10-17 00:50:27

认识CALayer的相关文章

CALayer与UIBezierPath

UIView继承于UIResponder CALayer继承于nsobject 创建UIView创建一个layer,通过UIView的layer属性可依访问它的图层.UIView具有事件处理功能,可以与用户交互,layer负责显示和动画任务. 要显示一个UIView,会自动调用起drawRect方法绘画所有内容,然后字啊将图层拷贝到屏幕上,完成UICView的显示. frame不能作动画  修改大小bounds  修改位子position CALayer不能直接使用UIColer.UIImage

CALayer 与 UIView

1.关系 On iOS, every UIView is backed by a Core Animation CALayer. Simply speaking,UIView inherit from NSResponder,handle events from users, contains CALayer,which inherit from NSObject,mainly focus on rendering,animation etc. One thing UIViews provide

CALayer初认识

CALayer :CA就是coreAnimation 核心动画 它是同时支持 Mac OS 和 iOS系统的 所有的核心动画都是通过CALayer来实现的 UIView本身是不具备显示功能的 是它内部的layer层才有显示功能 UIView之所以能被看到 就是因为内部层的存在: CZLayer的功能: 可以设置阴影 圆角大小 边框宽度和背景颜色 可以给图层添加动画 实现一些比较炫酷的效果 czlayer与uiview的比较 共同点 都能尽兴界面展示 不同点 CALayer不接收用户的触摸事件 u

通过 CALayer 修改 UIImageView 的界面属性

界面属性的修改是每一个开发者必须知道的,为什么我就记不住呢, shit, 又耽误了时间,为了防止再找不到,特把一些常用的 CALayer属性记在这里,顺便分享 1.设置阴影 1 imageView.layer.shadowColor = [UIColor grayColor].CGColor; 2 imageView.layer.shadowOffset = CGSizeMake(10, 10); 3 imageView.layer.shadowOpacity = 0.5; * 第1行设置阴影的

CALayer的使用

CALayer简介 1.CALayer一般作为UIView的容器而使用 2.CALayer是一个管理着图片载体(image-based content)的层结构 3.直接修改单独创建出的CALayer的属性可以出发隐式动画 4.UIView中的CALayer动画必须显示出发才能生效 CALayer实现自定义进度条 - (void)viewDidLoad { [super viewDidLoad]; UIView *containerView = [[UIView alloc] initWithF

IOS CALayer(二)

UIview内部有个默认的CALayer对象层,虽然我门不可以重新创建它,但是我门可以再其上面添加子层. 我们知道,UIView有 addSubview:方法,同样,CALayer也有addSublayer:方法.我门可以通过addSublayer:再已有layer上添加自层. 下面我门演示如何添加自层. // // ViewController.m // CX - CALayer(二) // // Created by ma c on 16/3/19. // Copyright ? 2016年

CALayer 的 position和anchorPoint属性

在iOS 中,UIButton.UIImage等UIView 之所以能够显示在屏幕上,是因为其内部有一个图层(CALayer).通过UIView的layer 属性可以访问这个图层: @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需要显示到屏幕上时,会调用 drawRect: 方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝的屏幕上,于是就完成了UIView的显示. UIView中有两个容易混淆

iOS Core Animation之CALayer心得

使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的API是较高级的封装,使用便捷,使得我们免于自己使用OpenGL实现动画.本文主要介绍如何使用CALayer的mask实现一个双向注水动画(姑且这么叫吧). 了解CALayer的mask 以上是CALayer的头文件关于mask的说明,mask实际上layer内容的一个遮罩. 如果我们把mask是透明的

让CALayer的shadowPath跟随bounds一起做动画改变-b

在iOS开发中,我们经常需要给视图添加阴影效果,最简单的方法就是通过设置CALayer的shadowColor.shadowOpacity.shadowOffset和shadowRadius这几个属性可以很方便的为 UIView 添加阴影效果.但是如果单用这几个属性会导致离屏渲染(Offscreen Rendering),而且CoreAnimation在每一帧绘制阴影的时候都需要递归遍历所有sublayer的alpha通道从而精确的计算出阴影的轮廓,这是非常消耗性能的,从而导致了动画的卡顿. 为

GIF动画,菊花动画,UIView动画,CoreAnimation动画(CALayer动画)的用法

1.GIF动画 1 // 创建一个显示图片的imageView // viewController创建 2 UIImageView *showGifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 414, 736)]; 3 [self.view addSubview:showGifImageView]; 4 5 6 //创建一个存储图片的数组 7 NSMutableArray *saveImageViewArray