最近在看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); }
待续