CALayer

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 *)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

你可能感兴趣的:(CALayer)