View继承自UIview,重写view的drawRect方法,此方法由系统调用,如果我们想调它,可以调setNeedDispaly,setNeedDispaly会调drawRect重绘UI
绘制的一般步骤:
1.取得与view关联的上下文context(drawRect方法中才能获取到);
2.绘图;
3.利用context把图绘制到view的图层Layer上;
-(void)drawRect:(CGRect)rect
{
CGContextRef ctx =UIGraphicsGetCurrentContext();//获取context
CGContextSaveGState(ctx);//copy ctx 复制一份ctx,避免画出的2条线有相同的属性(圆角,颜色,宽度、、、)(方法2)
CGContextMoveToPoint(ctx,10,10);//画线
CGContextAddLineToPoint(ctx,50,100);
//result sencond line have same setup
CGContextSetLineCap(ctx,kCGLineCapRound);//设置属性
CGContextSetLineWidth(ctx,20);
[[UIColorbrownColor]set];
CGContextStrokePath(ctx);
CGContextMoveToPoint(ctx,50,10);
CGContextAddLineToPoint(ctx,30,100);
// CGContextSetLineCap(ctx, kCGLineCapButt);///避免属性重复 重置属性(方法1)
// CGContextSetLineWidth(ctx, 1);
// [[UIColor blackColor] set];
CGContextRestoreGState(ctx); (方法2)//获得干净的ctx
CGContextStrokePath(ctx);
// CGContextScaleCTM(ctx, 0.5, 1.5); //位置不同达到的效果也是不同的,涉及矩阵变换
// CGContextTranslateCTM(ctx, 50, -50);
CGContextRotateCTM(ctx,M_PI_4);//before drawRect // rotate the layer of the view 旋转view的图层layer 这是2维的基本变换,底层也就是几个矩阵间点乘
CGContextScaleCTM(ctx,0.5,1.5);//缩放 CTM:ctrimax
CGContextTranslateCTM(ctx,50, -50);//平移
CGContextAddRect(ctx,CGRectMake(200,10,100,100)); //内切圆
CGContextAddEllipseInRect(ctx,CGRectMake(200,110,50,50));//矩形
CGContextAddArc(ctx,290,40,30,0,2*M_PI,0); origin和raduis画圆
CGContextStrokePath(ctx);
// [[UIColor whiteColor] set];
// CGContextFillPath(ctx);//tian chong
}
避免画出的2条线有相同的属性(圆角,颜色,宽度、、、)还有一种很关键的方法,指定CGContextPath或者CGContextSetStrokeColorWithColor
-(void)drawRect:(CGRect)rect
{
CGContextRef ctx =UIGraphicsGetCurrentContext();
CGMutablePathRef path =CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,20,20);
CGPathAddLineToPoint(path,NULL,100,100);
CGContextSetStrokeColorWithColor(ctx, [UIColorredColor].CGColor);
CGContextAddPath(ctx, path);//可以理解为context里有一块保存绘图的区域和一块属性配置区域
CGContextStrokePath(ctx);
CGMutablePathRef path2=CGPathCreateMutable();
CGPathMoveToPoint(path2,NULL,50,20);
CGPathAddLineToPoint(path2,NULL,30,100);
CGContextSetStrokeColorWithColor(ctx, [UIColorblackColor].CGColor);
CGContextAddPath(ctx, path2);
CGContextStrokePath(ctx);
CGMutablePathRef path1 =CGPathCreateMutable();
// [[UIColor redColor] set];
CGPathAddEllipseInRect(path1,NULL,CGRectMake(100,20,50,50));
CGContextAddPath(ctx, path1);
CGContextStrokePath(ctx);
CGPathRelease(path);
CGPathRelease(path1);//这些都是c函数,所以要释放(不是o-c)
CGPathRelease(path2);
// CFRelease(path1);
CGContextStrokeRect(ctx,CGRectMake(170,20,50,50));
CGContextFillRect(ctx,CGRectMake(240,20,50,50));
}