- (void)drawLine {
//1.获取当前跟View相关联的上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
UIBezierPath *path = [UIBezierPath bezierPath];
//一个路径可以描述多条线/
//2.1设置起点
//坐标原点是以当前绘制View的左上角为(0,0)
[path moveToPoint:CGPointMake(50, 50)];
//2.2添加一根线到某个点
[path addLineToPoint:CGPointMake(150, 150)];
[path moveToPoint:CGPointMake(100, 50)];
[path addLineToPoint:CGPointMake(150, 250)];
//把上一路径的终点做为下一个路径的起点
[path addLineToPoint:CGPointMake(250, 50)];
//设置上下文的状态
//设置线宽度
CGContextSetLineWidth(ctx, 10);
//设置上下文的连接样式
CGContextSetLineJoin(ctx, kCGLineJoinBevel);
//设置顶角样式
CGContextSetLineCap(ctx, kCGLineCapRound);
//设置线的颜色
//setStroke setFill
//如果直接使用set,会自动匹配渲染的模式.
[[UIColor redColor] set];
//3.把路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
//4.把上下文的当中绘制的所有路径渲染View相关联的layer当中.
//渲染的方式有两种:
//描边:stroke
//填充:fill
CGContextStrokePath(ctx);
}
- (void)quadCurveLine {
//1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
UIBezierPath *path = [UIBezierPath bezierPath];
//画曲线
[path moveToPoint:CGPointMake(50, 250)];
//添加一根曲线到某个点
[path addQuadCurveToPoint:CGPointMake(250, 250) controlPoint:CGPointMake(50, 50)];
//3.把路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
//4.把上下文的内容渲染到View的layer;
CGContextStrokePath(ctx);
}
- (void)drawShape {
//在此方法内部会自动创建 一个跟View相关联的上下文
//可以直接获取
//无论是开启上下文,还是获取上下文,都是以UIGraphics
//1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
//UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 200, 100)];
//描述圆角矩形
//cornerRadius:圆角半径
//UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 50, 200, 200) cornerRadius:100];
//描述椭圆
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 200, 200)];
//3.把路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
//设置上下文的状态,必须得要在渲染之前设置.
[[UIColor yellowColor] set];
//4.把上下文的内容渲染到View的layer;
//CGContextStrokePath(ctx);
//填充
CGContextFillPath(ctx);
//画椭圆
// 只要是往Veiw上面画东西,必须得要在drawRect当中进行
//UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 200, 200)];
//[[UIColor redColor] set];
//[path stroke];
}
平时我们设置的圆角半径,就是图中两点之间的距离
//作用:专门用来绘图
//什么时候调用:当View显示时调用
//参数:当前View的bounds
- (void)drawRect:(CGRect)rect {
//画弧
//Center:弧所在圆的圆心
//radius:弧所在圆的半径
//startAngle:开始角度 ;0度是在圆的最右侧,向上,度数是负的,向下,度数是正的.
//endAngle:截至角度 (哪个位置)
//clockwise:是否为顺时针 (怎么样到这个位置)
CGPoint center = CGPointMake(rect.size.width * 0.5, rect.size.height * 0.5);
CGFloat radius = rect.size.width * 0.5 - 10;
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
radius:radius startAngle:0 endAngle:-M_PI_2 clockwise:NO];
//添加一根线到圆心
[path addLineToPoint:center];
//关闭路径(从路径的终点连接一根到到路径的起点)
//[path closePath];
[path fill]; //当使用填充时,会自动关闭路径
//1.获取上下文->2.描述路径->3.把路径添加到上下文->4.把上下文的内容渲染到View的layer;
}
绘制下载进度条
#import "ProgressView.h"
@implementation ProgressView
- (void)setProgressValue:(CGFloat)progressValue {
_progressValue = progressValue;
//[self drawRect:self.bounds];
//当系统调用drawRect方法时 在drawRect:内部会自动创建跟View相关联的上下文
//手动调用,是不会创建上下文.
//通知系统,调用drawRect
//重绘,就是调用drawRect,重新绘制
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect {
// Drawing code
CGPoint center = CGPointMake(rect.size.width * 0.5, rect.size.height * 0.5);
CGFloat radius = rect.size.width * 0.5 - 10;
CGFloat startA = -M_PI_2;
CGFloat endA = startA + self.progressValue * M_PI * 2;
//1.获取跟View相关联的上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
[path addLineToPoint:center];
//3.把路径添加到上下文
CGContextAddPath(ctx, path.CGPath);
[[UIColor colorWithWhite:1 alpha:0.5] set];
//4.把上下文的内容渲染的View上
CGContextFillPath(ctx);
}
网友评论