iOS之 重绘机制

最近在看Core Animation , 今天来谈谈CALayer 和 UIView 中的重绘的一些认识:

我们都知道UIView里面有个成员layer,利用这个这个layer我们可以设置一些圆角,阴影什么的,或者

self.view.layer.contents = (__bridge id)([UIImage imageNamed:@"calayer_bg"].CGImage);

 在这里我就不过多的阐述UIView和CALayer的异同了。

创建一个CALayer的一个子类CustomLayer,重写

@implementation CustomLayer

// 重写该方法,在该方法内绘制图形
- (void)drawInContext:(CGContextRef)ctx{
//     画一个圆
    CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
    // 设置属性
    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
    // 渲染
    CGContextFillPath(ctx);
}

@end

然后再某个VC上进行使用

    .....

    CustomLayer *layer = [CustomLayer layer];
    // 设置layer的属性
    layer.backgroundColor = [UIColor brownColor].CGColor;
    layer.bounds = CGRectMake(0, 0, 200, 200) ;
    layer.anchorPoint = CGPointZero;
    layer.position = CGPointMake(100, 100);
    layer.cornerRadius = 20;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.shadowOffset = CGSizeMake(10, 20);
    layer.shadowOpacity = 0.6;
    [layer setNeedsDisplay];
    [self.view.layer addSublayer:layer];
    ......

 在自定义layer中的-(void)drawInContext:方法不会自己调用,只能自己通过setNeedDisplay方法调用.

在view中画东西drawRect:方法在view第一次显示的时候会自动调用。

上面是第一种方法使得layer重绘。其实还有方法二,就是 设置layer的delegate为VC,在VC上实现

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx,我们这个时候在CustomLayer不需要再去重写 -(void) drawInContext:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
    CGContextSetRGBFillColor(ctx, 0, 1, 1, 1);
    CGContextFillPath(ctx);
}

待续

原文地址:https://www.cnblogs.com/Ohero/p/4747646.html