一. layer
在每个UIView内部都有一个layer这样一个属性.
UIView之所以能够显示,就是因为它里面有这个一个层,才具有显示的功能.
二. 操作layer改变UIView的外观
1. 设置阴影
_RedView.layer.shadowOpacity = 1;
2. 设置阴影的圆角
_RedView.layer.shadowRadius =10;
3. 设置阴影的压缩
_RedView.layer.shadowColor = [UIColor blueColor].CGColor;
4. 设置边框宽度和颜色
_RedView.layer.borderColor = [UIColor whiteColor].CGColor; // 颜色,在图层中使用CoreGraphics的CGColorRef
_RedView.layer.borderWidth = 2; // 宽度
5. 设置view的圆角半径,如果设置为view宽度的一半就是一个圆
_RedView.layer.cornerRadius = 50;
6. 超出裁剪区域的部分全部裁剪掉
_imageView.layer.masksToBounds = YES;
注意:UIImageView当中Image并不是直接添加在层上面的.这是添加在layer当中的contents里.
我们设置层的所有属性它只作用在层上面.对contents里面的东西并不起作用.所以我们看不到图片有圆角的效果.
想要让图片有圆角的效果.可以把masksToBounds这个属性设为YES,
当设为YES,把就会把超过根层以外的东西都给裁剪掉.
7. layer的CATransform3D属性
只有旋转的时候才可以看出3D的效果.
旋转
x,y,z 分别代表x,y,z轴.
CATransform3DMakeRotation(M_PI, 1, 0, 0);
平移
CATransform3DMakeTranslation(x,y,z)
缩放
CATransform3DMakeScale(x,y,z);
可以通过KVC的方式进行设置属性.
但是CATransform3DMakeRotation它的值,是一个结构体, 所以要把结构转成对象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
三. 自定义CALayer
1. 创建layer
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(50, 50, 100, 100);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];
2. 给layer设置图片
layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage;
3. UIView和CALayer的选择
对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以
如果显示出来的东西需要跟用户进行交互的话,用UIView;
如果不需要跟用户进行交互,用UIView或者CALayer都可以
CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级
4. layer的属性
1> position : 设置layer在父控件中的位置,以父控件的(0, 0)为坐标原点
2> anchorPoint(锚点) : 决定layer身上的哪个点在position点所指的位置, 以自己的左上角为坐标原点(0, 0);
取值范围: 0 ~ 1;
默认值: (0.5, 0.5);
layer身上的anchorPoint会自动定到position所在的位置.
四. 隐式动画
控件中layer层称为根层,手动添加的layer为非根层.修改非根层属性会自动有隐式动画
如何取消隐式动画?
首先要了解动画底层是怎么做的.动画的底层是包装成一个事务来进行的.
什么是事务?
很多操作绑定在一起,当这些操作执行完毕后,才去执行下一个操作.
开启事务
[CATransaction begin];
设置事务没有动画
[CATransaction setDisableActions:YES];
设置动画执行的时长
[CATransaction setAnimationDuration:2];
提交事务
[CATransaction commit];