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