CALayer

作者: 6灰太狼9 | 来源:发表于2018-07-06 11:03 被阅读8次

    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

    相关文章

      网友评论

          本文标题:CALayer

          本文链接:https://www.haomeiwen.com/subject/vwrvuftx.html