iOS开发之CALayer介绍
Posted 星星太阳鱼虾蟹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发之CALayer介绍相关的知识,希望对你有一定的参考价值。
CALayer简介:
-
CALayer我们又称它叫做层,CALayer类的概念与UIView非常类似,并且可以包含图片、文本、背景色等。它与UIView最大的不同在于它不能响应用户交互,可以说它根本就不知道响应链的存在,它的 API 虽然提供了 “某点是否在图层范围内的方法”,但是它并不具有响应的能力。
-
在每一个UIView实例当中,都有一个默认的支持图层layer,UIView负责创建并且管理这个图层。实际上 UIView之所以能够显示,就是因为它里面有这个一个层,才具有显示的功能 ,UIView仅仅是对它的一层封装,实现了CALayer的delegate,提供了处理事件交互的具体功能,还有动画底层方法的高级API。可以说CALayer是UIView的内部实现细节。
UIView中的layer属性
- 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层
@property(nonatomic,readonly,retain) CALayer *layer;
-
CALayer类的属性
-
注意:CALayer是定义在QuartzCore框架中的,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
宽度和高度 @property CGRect bounds; 位置(默认指中心点,具体由anchorPoint决定) @property CGPoint position; 锚点(x,y的范围都是0-1),决定了position的含义 @property CGPoint anchorPoint; 背景颜色(CGColorRef类型) @property CGColorRef backgroundColor; 形变属性 @property CATransform3D transform; 边框颜色(CGColorRef类型) @property CGColorRef borderColor; 边框宽度 @property CGFloat borderWidth; 圆角半径 @property CGColorRef borderColor; 内容(比如设置为图片CGImageRef) @property(retain) id contents;
-
操作layer改变UIView和UIImageView外观
@interface ViewController () @property (weak, nonatomic) IBOutlet UIView *yellowView; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //设置边框(边框宽度往里走的) self.imageView.layer.borderColor = [UIColor redColor].CGColor; self.imageView.layer.borderWidth = 3; //设置阴影 self.imageView.layer.shadowColor = [UIColor blueColor].CGColor; self.imageView.layer.shadowOpacity = 1; //阴影的不透明度,默认是0 self.imageView.layer.shadowOffset = CGSizeMake(-10, 10); self.imageView.layer.shadowRadius = 50; //越大越模糊 //设置圆角半径 self.imageView.layer.cornerRadius = 50; //超过根层以外的内容就会自动裁剪掉.------阴影也会没有,不能共存 self.imageView.layer.masksToBounds = YES; NSLog(@"%@",self.imageView.layer.sublayers); NSLog(@"%@",self.imageView.layer.contents); //imageView的图片存放在layer的contents里面.所以设置layer的圆角半径不会影响到图片 } - (void)UIViewLayer { //设置边框(边框宽度往里走的) self.yellowView.layer.borderColor = [UIColor redColor].CGColor; self.yellowView.layer.borderWidth = 3; //设置阴影 self.yellowView.layer.shadowColor = [UIColor blueColor].CGColor; self.yellowView.layer.shadowOpacity = 1; //阴影的不透明度,默认是0 self.yellowView.layer.shadowOffset = CGSizeMake(-10, 10); self.yellowView.layer.shadowRadius = 50; //越大越模糊 //设置圆角半径 self.yellowView.layer.cornerRadius = 50; }
不同点:
注意:UIImageView当中Image并不是直接添加在层上面的.这是添加在layer当中的contents里.
我们设置层的所有属性它只作用在层上面.对contents里面的东西并不起作用.所以我们看不到图片有圆角的效果.
想要让图片有圆角的效果.可以把masksToBounds这个属性设为YES,
当设为YES,把就会把超过根层以外的东西都给裁剪掉.
-
CALayer的 CATransform3D属性
旋转,x,y,z 分别代表x,y,z轴.(如UIView的动画都是绕着Z轴变化的)
self.imageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
平移
self.imageView.layer.transform = CATransform3DScale(self.imageView.layer.transform, 0.5, 0.5, 0);
缩放
self.imageView.layer.transform = CATransform3DTranslate(self.imageView.layer.transform, 50, 50, 0);
可以通过KVC的方式进行设置属性.
但是CATransform3DMakeRotation它的值,是一个结构体, 所以要把结构转成对象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];
后面forKeyPath属性值不是乱写的.苹果文档当中给了相关的属性.
CALayer的position和anchorPoint
position和anchorPoint是CAlayer的两个属性.
我们以前修改一个控件的位置都是能过Frame的方式进行修改.
现在利用CALayer的position和anchorPoint属性也能够修改控件的位置.
这两个属性是配合使用的.
- position:它是用来设置当前的layer在父控件当中的位置的.
所以它的坐标原点.以父控件的左上角为(0.0)点. - anchorPoint:它是决点CALayer身上哪一个点会在position属性所指的位置
anchorPoint它是以当前的layer左上角为原点(0.0)
它的取值范围是0~1,它的默认在中间也就是(0.5,0.5)的位置.anchorPoint又称锚点.就是把锚点定到position所指的位置.
两者结合使用.想要修改某个控件的位置,我们可以设置它的position点.
设置完毕后.layer身上的anchorPoint会自动定到position所在的位置
隐式动画
了解什么是隐式动画前,要先了解是什么根层和非根层.
1.根层:UIView内部自动关联着的那个layer我们称它是根层.
2.非根层:自己手动创建的层,称为非根层.
隐式动画就是当对非根层的部分属性(bounds、backgroundColor、position等)进行修改时, 它会自动的产生一些动画的效果.
我们称这个默认产生的动画为隐式动画.
- 如何取消隐式动画?
首先要了解动画底层是怎么做的.动画的底层是包装成一个事务来进行的.
什么是事务?
很多操作绑定在一起,当这些操作执行完毕后,才去执行下一个操作.开启事务 [CATransaction begin]; 设置事务没有动画 [CATransaction setDisableActions:NO]; 设置隐式动画执行的时长 [CATransaction setAnimationDuration:2]; 提交事务 [CATransaction commit];
作者:李小南
链接:http://www.jianshu.com/p/42b98ca384b7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于iOS开发之CALayer介绍的主要内容,如果未能解决你的问题,请参考以下文章