UIView和CALayer关系
1.每个view都有layer的属性,CALayer 就比 UIView 轻量级,且CALayer不能响应事件。而且他们之间存在代理关系。
view.layer.delegate = view
WechatIMG8.jpeg
2.当一个subview被添加到了另一个superview上,那个这个subview的layer也会被添加到superview的layer上。
3.UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等, 实际上内部都是在访问它所包含的CALayer的相关属性。
4.UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。
第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。
CALayer的属性
CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。隐式属性动画的本质是这些属性的变动默认隐含了CABasicAnimation动画实现。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.layer = [[CALayer alloc] init];
self.layer.frame = CGRectMake(100, 100, 200, 200);
self.layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.layer];
self.layer.cornerRadius = 100;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGFloat width = self.layer.bounds.size.width;
if (width==200) {
width = 100;
}else{
width = 200;
}
self.layer.bounds = CGRectMake(0, 0, width, width);
self.layer.position = [touch locationInView:self.view];
self.layer.cornerRadius = width/2;
}
QQ20180706-104858.gif
网友评论