画饼状图
- (void)drawRect:(CGRect)rect {
// Drawing code
// 需求:根据sections的数据,绘制多个扇形
// 1.获取上下文(Layer Graphics Context)
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 2.根据sections的个数,计算扇形的起始和结束位置来画扇形
NSInteger count = self.sections.count;
// 如果没有数据,直接返回,不用画
if(count == 0) return;
// 圆心
CGFloat centerX = rect.size.width * 0.5;
CGFloat centerY = rect.size.height * 0.5;
//半径就是x的中心点
CGFloat radius = centerX;
// 计算所有组的总数
NSInteger sum = 0;
for (NSInteger i = 0; i < count; i++) {
sum += [self.sections[i] integerValue];
}
// 默认设置扇形的起始位置为 0
CGFloat startAngle = 0;
for (NSInteger i = 0; i < count; i++) {
// 计算每组占用的比例
#warning 计算float的值,一要除以一个float类型值
CGFloat scale = [self.sections[i] integerValue] / (sum * 1.0);
// 指定颜色
UIColor *sectionColor = self.sectionColors[i];
[sectionColor set];
// 计算结束的位置
#warning 计算结束的位置 = 起始位置 + 需要的画的弧度
CGFloat endAngle = startAngle + scale * 2 * M_PI;
#warning 指定 "弧" 的中心点路径
CGContextMoveToPoint(ctx, centerX, centerY);
// 画弧
CGContextAddArc(ctx, centerX, centerY, radius, startAngle, endAngle, 0);
// 渲染
CGContextFillPath(ctx);
NSLog(@"scale:%f startAngle:%f endAngle:%f",scale, startAngle,endAngle);
// 重新设置起始的位置,供一次循环使用
startAngle = endAngle;
}
}
- (void)drawRect:(CGRect)rect {
// Drawing code
// 需求: 先画一个矩形,颜色为红色,线宽为3
// 再画一个矩形,颜色为黑色,线宽为默认
// 上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 保存一个当前上下文的绘图状态到一个栈里面
// G代理Graphics[绘图]
CGContextSaveGState(ctx);
// CGContextSaveGState(ctx);
// 画红色,线宽为3的矩形
[[UIColor redColor] set];
CGContextSetLineWidth(ctx, 3);
CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
CGContextStrokePath(ctx);
// 画黑色,线宽为默认的矩形
// [[UIColor blackColor] set];
// CGContextSetLineWidth(ctx, 1);
// 恢复 当前上下文的状态
// CGContextRestoreGState(ctx);
CGContextAddRect(ctx, CGRectMake(10, 120, 50, 50));
CGContextStrokePath(ctx);
//再恢复
#warning 恢复状态不能随便调用,保存了多少次绘图状态,就可以调用多少
// CGContextRestoreGState(ctx);
}
- (void)drawRect:(CGRect)rect {
// Drawing code
//矩阵操作 平移、绽放,旋转
// 画个三角形 + 画一条线
CGContextRef ctx = UIGraphicsGetCurrentContext();
#warning qurtz2d的平移,要在绘制之前
//平移
//CGContextTranslateCTM(ctx, 0,50);
//缩放
//CGContextScaleCTM(ctx, 1.5, 1.5);
//旋转
// 负数 逆时针/ 正数 顺时针
// 围绕左上角(0,0) 旋转
CGContextRotateCTM(ctx, - M_PI * 0.25);
// 定义三个点
CGPoint points[3] = {
{50,20},{100,80},{10,80}};
CGContextAddLines(ctx, points, 3);
// 合并三个点的路径
CGContextClosePath(ctx);
// 画线
CGPoint linePoints[2] = {
{10,20},{80,80}};
CGContextAddLines(ctx, linePoints, 2);
CGContextStrokePath(ctx);
// 渲染
CGContextStrokePath(ctx);
}
裁剪圆角图片
- (void)drawRect:(CGRect)rect {
// Drawing code
// 1.实现裁剪图片显圆形 并显示
// 1.1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 1.2.指定圆的路径,并圆外面多余的剪切掉[CGContextClip]
#warning CGContextClip方法要记住
// 定义图片的Rect
CGRect imageRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
CGContextAddEllipseInRect(ctx, imageRect);
CGContextClip(ctx);
// 1.3.就把图片显示在UIView
UIImage *image = [UIImage imageNamed:self.imageName];
[image drawInRect:imageRect];
// 2.添加一个圆的边框
//线宽
CGContextSetLineWidth(ctx, self.borderWidth);
//设置边框的颜色
[self.borderColor set];
CGContextAddEllipseInRect(ctx, imageRect);
CGContextStrokePath(ctx);
}