苹果的官方文档说了, UIImageView是专门为显示图片做的控件,用了最优显示技术,是不让调用darwrect方法的, 要调用这个方法,只能从uiview里重写。
Quartz 2D的基本使用:
//在- (void)drawRect:(CGRect)rect方法中进行绘制图形
注意:下面的方法都是UIView的方法,绘制图形或者文字图片也都是在view中绘制的
1,绘制基本图形:
1.1,创建上下文
CGContextRef ctxRef = UIGraphicsGetCurrentContext();
1.2,利用上下文绘制:
- 方法一:
CGContextMoveToPoint(ctxRef, 0, 0);
CGContextAddLineToPoint(ctxRef, 200, 400);
- 方法二:
CGContextAddRect(ctxRef, CGRectMake(10, 10, 200, 200));
//或者
CGContextAddArc(ctxRef, 150, 150, 100, 0, M_PI*2, 0);
1.3,绘制完后利用上下文设置属性并显示出来
[[UIColor redColor] setStroke];//设置颜色
CGContextSetLineWidth(ctxRef, 10);//设置线宽
CGContextStrokePath(ctxRef);//显示描边图形
//CGContextFillPath(ctxRef);//显示填充图形
2,绘制图片或者文字:
//文字:不需要上下文
//两个方法:
//1,既是NSString的方法,也是UIImage的方法,不能换行,后面的字典是字体属性
- (void)drawAtPoint:(CGPoint)point withAttributes:(nullable NSDictionary<NSString *, id> *)attrs;
//2,限定在rect中,后面的字典是字体属性
- (void)drawInRect:(CGRect)rect withAttributes:(nullable NSDictionary<NSString *, id> *)attrs
NSString *str = @"zhangdanfeng";
[str drawAtPoint:CGPointMake(100, 100) withAttributes:nil];
UIImage *image = [UIImage imageNamed:@"gesture_node_highlighted@2x"];
[image drawAtPoint:CGPointMake(50, 50)];
//这个方法是image特有的方法
[image drawAsPatternInRect:CGRectMake(50, 50, 200, 200)];
3,图形上下文栈
//有点是需要注意的,这个是先进后出的,如果保存了多个上下文栈,取出的时候顺序是反着取出来
CGContextRef ctxRef = UIGraphicsGetCurrentContext();
//保存上下文
CGContextSaveGState(ctxRef);
CGContextSetLineWidth(ctxRef, 10);
CGContextMoveToPoint(ctxRef, 0, 0);
CGContextAddLineToPoint(ctxRef, 50, 50);
CGContextStrokePath(ctxRef);
// CGContextSaveGState(ctxRef);
//取出上下文
CGContextRestoreGState(ctxRef);
CGContextMoveToPoint(ctxRef, 110, 100);
CGContextAddLineToPoint(ctxRef, 200, 200);
CGContextStrokePath(ctxRef);
4,全局矩阵操作:
//(角度顺时针是正值,逆时针是负值)
CGContextRef ctxRef = UIGraphicsGetCurrentContext();
//放在前面,对之后的所有的绘画都有作用
CGContextScaleCTM(ctxRef, 1.5 , 1.5);
CGContextRotateCTM(ctxRef, M_PI_4/2);
//保存上下文
CGContextSaveGState(ctxRef);
CGContextSetLineWidth(ctxRef, 10);
CGContextMoveToPoint(ctxRef, 0, 0);
CGContextAddLineToPoint(ctxRef, 50, 50);
CGContextStrokePath(ctxRef);
//取出上下文
CGContextRestoreGState(ctxRef);
CGContextMoveToPoint(ctxRef, 110, 100);
CGContextAddLineToPoint(ctxRef, 200, 200);
CGContextStrokePath(ctxRef);
注意:如果不想影响到第二条线段,只需要把存储上下文栈的代码放到操作之前保存上下文即可