CGContextRef
在调用drawRect:方法之前,视图对象会自动配置其描画环境,使代码可以立即进行描画。作为这些配置的一部分,UIView 对象会为当前绘制环境创建一个图形上下文,这个上下文就是CGContextRef 封装类型。
CGContextRef的对象是以栈的形式存放的,把对象放入栈中,使用CGContextSaveGState方法,将对象从栈中取出来,使用的是CGContextRestoreGState方法。
分析以下代码:
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 将上下文压入栈中 CGContextSaveGState(ctx); CGContextSetLineWidth(ctx, 10); CGContextSetLineCap(ctx, kCGLineCapRound); [[UIColor redColor] set]; // 画线 CGContextMoveToPoint(ctx, 50, 50); CGContextAddLineToPoint(ctx, 300, 450); CGContextStrokePath(ctx); CGContextRestoreGState(ctx); // 第二条线 CGContextMoveToPoint(ctx, 30, 80); CGContextAddLineToPoint(ctx, 100, 350); CGContextStrokePath(ctx); CGContextRelease(ctx);
限制上下文的绘制区域
默认情况下,上下文的绘制区域就是整个View所在的区域,不过我们也可以手动的规定绘制区域。可以使用CGContextClip进行绘制区域的裁切。示例代码如下:
CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddArc(ctx, 150, 150, 30, 0, M_PI*2, 1); // 裁切操作一定要放在绘制之前(裁切之后的操作,只能在裁切制定的区域进行相印的绘图操作了) CGContextClip(ctx); CGContextFillPath(ctx); UIImage *myImage = [UIImage imageNamed:@"www.jpg"]; [myImage drawAtPoint:CGPointMake(110, 120)]; CGContextRelease(ctx);
强制重绘: setNeedsDisplay
默认情况下,绘制工作只会在View第一次显示的时候调用,但可以通过[self setNeedsDisplay]进行手动的调用工作。
Demo:
当你拖动UISlider,上面的圆的半径也一直跟着变换。实现思路就是,UISlider的值在变化的时候,让上面的圆的半径也一直跟随着变化,并且一直在重绘。
UISlider的事件代码:
- (IBAction)drawArc:(UISlider *)sender { self.drawView.radius = sender.value; }
-(void)setRadius:(CGFloat)radius { _radius = radius; [self setNeedsDisplay]; } - (void)drawRect:(CGRect)rect { CGContextRef cxt = UIGraphicsGetCurrentContext(); CGContextAddArc(cxt, 100, 100, self.radius, 0, M_PI*2, 1); CGContextStrokePath(cxt); }
原文地址:http://blog.csdn.net/sinat_27706697/article/details/45965827