码迷,mamicode.com
首页 > 其他好文 > 详细

drawLayer和drawRect

时间:2014-11-25 12:14:42      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   sp   strong   on   div   2014   

// 这是2个方法的理解:
1.drawLayer是一个图层的代理方法。每个UIView都由自己的基层CaLayer,它会自动调用这个drawlayer方法将其事先设置好的各种属性绘制在这个基本的图层上面
2.如果复写这个方法,一定要调用[super drawLayer:layer inContext:ctx],否则就没意义了。
3.这个方法里面会自动调用drawRect方法,这就是方便开发者,在基本图层的基础上再次自定义。(这就是为什么结果会先输出drawRect)
4.破解这限制很简单:将这个代理里面做一个逻辑判断(没尝试过),再有就是写一个代理类嘛.(尼玛,千万别尝试第一种,刚直接重启了)
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ [super drawLayer:layer inContext:ctx]; CGContextAddEllipseInRect(ctx, CGRectMake(0,0,100,100)); CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor); CGContextFillPath(ctx); NSLog(@"drawLayer"); } -(void)drawRect:(CGRect)rect{ NSLog(@"drawRect"); }

输出结果:

2014-11-25 10:15:36.723 TestCoreGraphics[1282:60b] drawRect

2014-11-25 10:15:36.725 TestCoreGraphics[1282:60b] drawLayer

图层绘制举例:

#import <UIKit/UIKit.h>
#import "MainCaLayer.h"
#import "MyLayerDelegate.h"

@interface MainView : UIView

@property(nonatomic,strong)CALayer *Mylayer;
@property(nonatomic,strong) MyLayerDelegate *dele;

@end
#import "MainView.h"

@implementation MainView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor=[UIColor brownColor];
        self.Mylayer=[CALayer layer];
        self.Mylayer.frame=self.bounds;
        [self.layer addSublayer:self.Mylayer];
        self.Mylayer.backgroundColor=[UIColor colorWithRed:154/255.0 green:10/255.0 blue:14/255.0 alpha:0.5].CGColor;
        self.dele=[[MyLayerDelegate alloc]init];//为什么要自己保留一次再给layer的代理呢,因为layer的代理是assin模式,必须自己强引用(strong)一次再给代理,否则会报错,因为出括号当前对象就被释放了,但是用viewcontroler就不存在,因为controler的生命周期绝对比自身的view生命长久。所以稍微注意下就ok
        self.Mylayer.delegate=self.dele;
        [self.Mylayer setNeedsDisplay];//就算是第一次调用,也需要调用此方法才会被重新绘制
        
    }
    return self;
}
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{//其实这个方法如果不是代理类的话,是没必要复写的,因为直接调用drawRect方法就可以再基层layer上面绘制东西了
    if (layer==[self layer]) {
        [super drawLayer:layer inContext:ctx];
        CGContextAddEllipseInRect(ctx, CGRectMake(0,0,100,100));
        CGContextSetFillColorWithColor(ctx, [UIColor yellowColor].CGColor);
        CGContextFillPath(ctx);
        NSLog(@"drawLayer");
    }
}
-(void)drawRect:(CGRect)rect{
NSLog(@"drawRect");
}
@end

//代理类

#import <Foundation/Foundation.h>

@interface MyLayerDelegate : NSObject

@end
#import "MyLayerDelegate.h"

@implementation MyLayerDelegate
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
        CGContextAddEllipseInRect(ctx, CGRectMake(100,200,100,100));
        CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
        CGContextFillPath(ctx);
        NSLog(@"drawLayer:inmylayer,dddd");
}
@end

viewcontroler也可以用自己作为代理类(简单就不举例了)

drawLayer和drawRect

标签:style   blog   io   color   sp   strong   on   div   2014   

原文地址:http://www.cnblogs.com/liyang31tg/p/4120349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!