媒体层:Core Graphics(绘图)

原创 2016年05月30日 10:20:39

1.简介:

基于C的API,用于绘图, 当使用UIKit来创建按钮、图像或者其他UIView的子类时,UIKit会使用Core Graphics来将这些元素绘制在屏幕上

可创建直线、路径、渐变、文字、图像等内容


CGContextRef:图像上下文、画布
从UIView的子类中获取它的当前上下文UIGraphicsGetCurrentContext(),然后重写drawRect方法
绘图动作是顺序的,每个动作都是在前一个动作的基础上面完成的
只要iOS任务一个视图需要被刷新或者重绘drawRect方法都会被调用,调用频率很高,刷新视图是不要直接调用
drawRect方法而是调用setNeedsDisplay方法:这会设置一个标志,告诉iOS在一个适当的时机为视图调用drawRect方法

Context是图形上下文,可以将其理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框.


上下文属性:
路径(Path)
阴影(Shadow)
笔画(Stroke)
剪裁路径(Clip Path)
线条宽度(Line Width)
混合模式(Blend Mode)
填充颜色(Fill Color)
当前形变矩阵(Current Transform Matrix)
线条图案(Line Dash)


创建自定义的用户界面通常是使用一个空白的图形上下文。


首先要明白current point的概念,在你调用CGContextMoveToPoint时,你其实是将一个点设置为current point,或者你调用了CGContextAddLineToPoint也同样在绘制线段后将current point修改为添加线段后的坐标点。


2.代码

   2.1实现效果

  -                                                                                                                                          


2.2 ViewController

#import "ViewController.h"
#import "CustomView.h"

#import "GraphicsView.h"
#import "DemoCGView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
     CustomView *view = [[CustomView alloc] initWithFrame:self.view.bounds];
//   GraphicsView *view = [[GraphicsView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:view];
}

@end

2.3 自定义视图

#import <UIKit/UIKit.h>

@interface CustomView : UIView

@end

#import "CustomView.h"

@implementation CustomView

//- (instancetype) initWithFrame:(CGRect)frame {
//    if (self = [super initWithFrame:frame]) {
//        self.backgroundColor = [UIColor whiteColor];
//    }
//    return self;
//
//}
// 参考文章:http://blog.csdn.net/rhljiayou/article/details/9919713
- (void) drawRect:(CGRect)rect {
    
    [self drawString:@"Core Graphics绘图" frame:CGRectMake(100, 20, self.frame.size.width, 25)];
    
    [self drawNullCircle];       // 空心圆
    [self drawSolidCircle];      // 实心圆
    [self drawCircle];
    [self drawArc];             // 画弧线
    
    [self drawLineSegment];     // 画线段
    [self drawLineSegment2];
    
    [self drawDashLine];        // 画虚线
    [self drawDashLine2];
    [self drawDashLine3];
    
    
    [self drawSimpleRect];      // 画矩形
    [self drawSimpleRect2];
    [self drawFillRect];
    [self drawFillStrokeRect];
    [self drawRoundRect];       // 圆角矩形

    [self drawEllipse];         // 画椭圆
    [self drawTriangle];        // 画三角形
    [self drawImage];           // 画图片
    [self drawSmileFace];       // 画笑脸
    [self drawFan];             // 画扇形
    [self drawGradient];        // 渐变(图层编程)
    
    [self drawQuadCurve];       // 二次曲线
    [self drawCurve];           // 三次曲线
    [self drawGradient2];       // 渐变
}




// 画字符串:直接使用NSString中的drawInRect:withFont 或 drawInRect:withAttributes方法即可
- (void)drawString:(NSString *)string frame:(CGRect)frame {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 1.0, 0, 0, 1.0);      // 红色
    UIFont *font = [UIFont boldSystemFontOfSize:11.0];
    CGContextSaveGState(context);
    CGContextSetShadow(context, CGSizeMake(10, 5), 2);       // 阴影白色背景下才能看出效果,可以重写initWithFrame设置背景色白色
    [string drawInRect:frame withAttributes:@{NSFontAttributeName:font, NSForegroundColorAttributeName:[UIColor redColor]}];
//  [string drawInRect:frame withFont:font];
    CGContextRestoreGState(context);
}


// 画空心圆
// 画空心圆就是画一个完整的圆形的弧线,画弧线需要知道的参数:
// 圆点(x, y)
// 半径radius,    因画圆使用画弧的方法,所以还需要其他参数:
// 开始弧度(startAngle),
// 结束弧度(endAngle),   弧度=180°/π (≈57.3°)   度=弧度×180°/π     360°=360×π/180=2π 弧度
// 旋转方向clockwise:0:顺时针 1:逆时针

/*
 *  弧度的定义是:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度
 *  弧度和角度的算法 参考文章:http://blog.chinaunix.net/uid-20622737-id-1913082.html
 *
 */

//void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
// 以(110, 70)为圆心,半径25, 顺时针 从0弧度到2π弧度开始画弧,  0~2π弧度是一个完整的圆
- (void)drawNullCircle {
    CGContextRef context = UIGraphicsGetCurrentContext();         // 获取绘画的当前的上下文:即画布
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);      // 设置笔触颜色:白色
    CGContextSetLineWidth(context, 1.0f);                         // 设置线的宽度
    CGContextAddArc(context, 30, 70, 15, 0, 2 * M_PI, 0);        // 添加弧度(弧度 0~2*M_PI即为 0~360度,即:一周)
    CGContextDrawPath(context, kCGPathStroke);                    // 绘制填充 路径绘画模式为:笔触模式 CGPathDrawingMode=kCGPathStroke
}


// 画实心圆
// 画空心圆只需要设置笔触颜色就可以了,画实心圆需要知道圆的内部颜色即填充颜色 路径绘画模式为:填充模式 CGPathDrawingMode=kCGPathFill
- (void)drawSolidCircle {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextAddArc(context, 90, 70, 25, 0, 2 * M_PI, 0);
    CGContextDrawPath(context, kCGPathFill);            // 路径填充
}

// 画圆:同时设置圆的边框border和填充颜色
- (void)drawCircle {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 3.0);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextAddArc(context, 160, 70, 30, 0, 2 * M_PI, 0);
    CGContextDrawPath(context, kCGPathFillStroke);      // 路径填充笔触
}

// 画弧线
- (void)drawArc {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 3.0f);
    
//    CGContextAddArc(context, 320, 70, 30, 0, 2 * M_PI / 6 * 1, 0);
//    CGContextAddArc(context, 250, 70, 30, 2 * M_PI / 6 * 1, 2 * M_PI, 1);
//    CGContextAddArc(context, 220, 70, 30, 0, 1, 0);
    CGContextAddArc(context, 240, 70, 30, 2 * M_PI / 6 * 5, 2 * M_PI, 0);
    
    CGContextDrawPath(context, kCGPathStroke);
}


// 画线段:画线端需要两个端点即可(起点和终点)
- (void) drawLineSegment {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2.0f);
 
    // 起点和终点
    CGPoint points[2] = {CGPointMake(10, 120), CGPointMake(60, 120)};
    
    CGContextAddLines(context, points, 2);
    CGContextDrawPath(context, kCGPathStroke);
}

// 画线段,方式二
// void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)
- (void)drawLineSegment2 {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetLineWidth(context, 10);
    
    // 将坐标p1(x, y)设置为当前点即起点, 当前点可以理解上当前笔触所在的位置,类似于电脑上讲光标从一个位置移动到另一个位置
    CGContextMoveToPoint(context, 70, 120);    // 起点
    CGContextAddLineToPoint(context, 140, 120); // 终点
    
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathStroke);
}

// 画虚线
// 直线可以看成由无数个小圆点....组成,这些圆点之间没有任何间隙,紧密挨着
- (void)drawDashLine {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGFloat lengths[] = {1, 3};                 //{小圆点,间隙点} 表示先绘制1个小圆点,然后再跳过3个小圆点作为间隙,接下拉再绘制一个小圆点,然后再跳过3个小圆点作为间隙,反复下去
    
    //CGContextSaveGState 和CGContextRestoreGState的理解:
    // CGContextSaveGState是对当前上下文状态做个标记的开始,CGContextRestoreGState用于标记的结束,标记范围内
    // 的修改只会对当前操作有效,对于标记之后是无效的。这样做的目的是放置当前的一些设置操作影响到接下来的操作
    // 例如:本例中为context设置了虚线 CGContextSetLineDash,如果本例操作完后CGContextRestoreGState,对后面的例子没有任何影响
    // 如果不加 CGContextSaveGState 和 CGContextRestoreGState,后面的绘图都变成虚线而不是实现了,因为所有绘图操作UIGraphicsGetCurrentContext()获得的是同一个实例
    CGContextSaveGState(context);
    CGContextSetLineDash(context, 0, lengths, 2);
    CGContextMoveToPoint(context, 150, 120);    // 起点
    CGContextAddLineToPoint(context, 200, 120); // 终点
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
}

- (void)drawDashLine2 {
    // phase参数表示在第一个虚线绘制的时候跳过多少个点
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGFloat lengths[] = {10, 10};
    
    CGContextSaveGState(context);
    CGContextSetLineDash(context, 5, lengths, 2);
    CGContextMoveToPoint(context, 210, 100);    // 起点
    CGContextAddLineToPoint(context, 355, 100); // 终点
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
}

- (void)drawDashLine3 {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGFloat lengths[] = {5, 10, 10}; // 先绘制5个点,跳过10个点 绘制10个点,跳过5个点 绘制10个点,跳过10个点 如此反复下去
    
    CGContextSaveGState(context);
    CGContextSetLineDash(context, 0, lengths, 3);
    CGContextMoveToPoint(context, 210, 120);    // 起点
    CGContextAddLineToPoint(context, 355, 120); // 终点
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
}



// 画矩形:知道起始点(x, y) 和 宽高 就可以了
// void CGContextAddRect(CGContextRef c, CGRect rect)
- (void)drawSimpleRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGContextAddRect(context, CGRectMake(10, 150, 60, 40));
    CGContextDrawPath(context, kCGPathStroke);
}

// 画矩形:方式二 根据点点连线,根据这种方式可以画任意多边形
- (void)drawSimpleRect2 {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
    
    CGPoint points[5] = {CGPointMake(90, 150), CGPointMake(150, 150), CGPointMake(150, 190), CGPointMake(90, 190), CGPointMake(90, 150)};
    
    CGContextAddLines(context, points, 5);
    CGContextDrawPath(context, kCGPathStroke);
}

// 画填充矩形
- (void)drawFillRect  {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor magentaColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    
    CGContextAddRect(context, CGRectMake(170, 150, 50, 30));
    CGContextDrawPath(context, kCGPathFill);
}

- (void)drawFillStrokeRect  {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor purpleColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    
    CGContextAddRect(context, CGRectMake(240, 150, 50, 40));
    CGContextDrawPath(context, kCGPathFillStroke);
}

// 对应CGContextAddArcToPoint方法的理解参考文章: http://blog.csdn.net/dick_china/article/details/7864428
// 参考文章: http://donbe.blog.163.com/blog/static/138048021201052093633776/
// void CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius)
- (void)drawRoundRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
    CGContextSetLineWidth(context, 3.0);
    
    float x = 330;
    float y = 150;
    
    float width = 60;
    float heigth = 40;
    
    float w = width / 2;
    float h = heigth / 2;
    
    // 设置当前点
    CGContextMoveToPoint(context, x, y);
    CGContextAddArcToPoint(context, x - w, y, x - w, y + h, 10);
    CGContextAddArcToPoint(context, x - w, y + h + h, x, y + h + h, 10);
    CGContextAddArcToPoint(context, x + w, y + h + h, x + w, y + h, 10);
    CGContextAddArcToPoint(context, x + w, y, x, y, 10);
 
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathStroke);
}


// 画椭圆:给定一个矩形范围,然后在矩形中画一个最大的椭圆
// void CGContextAddEllipseInRect(CGContextRef c, CGRect rect)
- (void) drawEllipse {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetLineWidth(context, 2);
    CGContextAddEllipseInRect(context, CGRectMake(20, 230, 60, 30));
    CGContextDrawPath(context, kCGPathStroke);
}

// 画三角形:知道三角形的三点坐标,然后连成线 即可, 和画线段、多边形原理一样
- (void)drawTriangle {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
    CGContextSetLineWidth(context, 2);
    
    CGPoint points[3] = {CGPointMake(100, 260), CGPointMake(160, 260), CGPointMake(100, 200)};
    CGContextAddLines(context, points, 3);
    CGContextClosePath(context);  // 关闭路径的意思是 :将当前点和起点连接起来 将终点(100, 200) 和 起点(100, 260)进行连接起来, 如果不关闭路径也可以像drawSimpleRect2方法一样处理,既:将终点和起点再连线一下
    CGContextDrawPath(context, kCGPathFillStroke);
}

// 画图片
- (void)drawImage {
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage *image = [UIImage imageNamed:@"1.jpeg"];
    CGContextDrawImage(context, CGRectMake(20, 280, 50, 50), image.CGImage);
}

// 画笑脸
- (void) drawSmileFace {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
    CGContextSetLineWidth(context, 3);
    
    // 左面部分
    CGContextMoveToPoint(context, 140, 280);
    CGContextAddArcToPoint(context, 120, 250, 100, 280, 25);
    CGContextStrokePath(context);
    
    // 右面部分
    CGContextMoveToPoint(context, 200, 280);
    CGContextAddArcToPoint(context, 180, 250, 160, 280, 25);
    CGContextStrokePath(context);
    
    // 下面部分
    CGContextMoveToPoint(context, 180, 320);
    CGContextAddArcToPoint(context, 150, 350, 120, 310, 30);
    CGContextStrokePath(context);
}

// 画扇形:其实就是画弧线CGContextAddArc,并使用填充笔触模式kCGPathFillStroke
- (void)drawFan {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    
    CGContextMoveToPoint(context, 250, 340);
    CGContextAddArc(context, 250, 340, 80, -60*M_PI/180, -120*M_PI/180, 1);
    
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
}

// 渐变矩形:在指定区域CGRect画层,然后将层添加到UIView的层上面,
- (void) drawGradient {
    CGRect frame = CGRectMake(290, 210, 70, 40);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGContextAddRect(context, frame);
    CGContextDrawPath(context, kCGPathStroke);
    
    
    // 渐变层
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = frame;
    gradient.colors = @[(id)[UIColor grayColor].CGColor,
                        (id)[UIColor blackColor].CGColor,
                        (id)[UIColor yellowColor].CGColor,
                        (id)[UIColor blueColor].CGColor,
                        (id)[UIColor redColor].CGColor,
                        (id)[UIColor greenColor].CGColor,
                        (id)[UIColor orangeColor].CGColor,
                        (id)[UIColor brownColor].CGColor
                        ];
    // 将渐变层插入到view层的最上方
    [self.layer insertSublayer:gradient atIndex:0];
}

// 二次曲线
// void CGContextAddQuadCurveToPoint(CGContextRef c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
// 控制点(cpx, cpy) 直线的终点坐标(x, y)
- (void)drawQuadCurve {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGContextMoveToPoint(context, 20, 450);
    CGContextAddQuadCurveToPoint(context, 80, 300, 160, 450);
    CGContextStrokePath(context);
}

// 三次曲线:一般是一条直线,然后定义几个控制点,使直线变完曲
// void CGContextAddCurveToPoint(CGContextRef c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
// 控制点1(cp1x, cp1y) 控制点2(cp2x, cp2y) 直线的终点坐标(x, y)
// 参考文章: http://donbe.blog.163.com/blog/static/138048021201052093633776/
- (void)drawCurve {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGContextMoveToPoint(context, 180, 430);
    CGContextAddCurveToPoint(context, 250, 300, 280, 490, 370, 450);
    CGContextStrokePath(context);
}


// 画渐变
- (void) drawGradient2 {
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    CGFloat colors[] = {
        1,1,1, 1.00,
        1,1,0, 1.00,
        1,0,0, 1.00,
        1,0,1, 1.00,
        0,1,1, 1.00,
        0,1,0, 1.00,
        0,0,1, 1.00,
        0,0,0, 1.00,
    };
    
    // 渐变圆
    CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
    CGColorSpaceRelease(rgb);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawRadialGradient(context, gradient, CGPointMake(330, 300), 0, CGPointMake(330, 300), 30, kCGGradientDrawsBeforeStartLocation);
    
    // 渐变
    CGContextSaveGState(context);
    CGContextMoveToPoint(context, 10, 500);
    CGContextAddLineToPoint(context, 200, 500);
    CGContextAddLineToPoint(context, 200, 650);
    CGContextAddLineToPoint(context, 10, 650);
    CGContextClip(context);     // 不剪裁的话宽度会是整个屏幕宽
    // 开始坐标和结束坐标是为了控制渐变的方向和形状
    // void CGContextDrawLinearGradient(CGContextRef c, CGGradientRef gradient, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions options)
    // startPoint:开始渐变的起始位置,endPoint 开始渐变的结束位置  options:渐变的方向,开始坐标之前,还是结束位置之后开始渐变
    CGContextDrawLinearGradient(context, gradient, CGPointMake(10, 500), CGPointMake(10, 650), kCGGradientDrawsBeforeStartLocation);
    CGContextRestoreGState(context);
}
@end


3.UIBezierPath

#import <UIKit/UIKit.h>

@interface GraphicsView : UIView

@end

#import "GraphicsView.h"

@implementation GraphicsView

- (instancetype) initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
    }
    
    return self;
}

// UIBezierPath 是对Core Graphics的封装
- (void)drawRect:(CGRect)rect {
    [self drawRoundRect];
    //[self drawCustomPath];
    
}


- (void) drawRoundRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(0, 5), 10);
    
    CGRect myRect = CGRectMake(60, 80, 200, 200);
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:myRect cornerRadius:30];
    [bezierPath fill];
    
    //CGContextSaveGState(context);
    
    // 当我们绘制渐变时,会填满整个图形上下文,所以需要按照路径进行剪裁
    [bezierPath addClip];       // 用圆角矩形路径对上下文进行剪切
    // 绘制渐变,这个渐变会被限制在剪裁路径的范围内
    CGContextDrawLinearGradient(context, [self _makeGradient], CGPointMake(0, 80), CGPointMake(0, 320), 0);
    //CGContextRestoreGState(context);
    
    // 绘制文字
    CGContextSetRGBFillColor(context, 0, 0, 0, 1);
    [@"iOS 5 Core Frameworks" drawInRect:CGRectMake(0, 120, 320, 200) withFont:[UIFont boldSystemFontOfSize:48] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
}


- (void)drawCustomPath {
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(160, 20)];
    [path addLineToPoint:CGPointMake(260, 340)];
    [path addArcWithCenter:CGPointMake(160, 340) radius:100 startAngle:0 endAngle:M_PI clockwise:YES];
    [path closePath];
    [path fill];
}

- (CGGradientRef) _makeGradient {
    CGFloat colors[8] = {1, 1, 1, 1, 222.0f/255.0f, 169.0f/222.0f, 269.0f/255.0f, 1};
    CGFloat colorStops[2] = {0.0, 1.0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, colorStops, 2);
    CGColorSpaceRelease(colorSpace);
    
    return gradient;
}
@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

opencv识别两个网球

#include "cxcore.h"      #include "cv.h"      #include "highgui.h"     #include "iostream" using...
  • ttomchy
  • ttomchy
  • 2016年05月08日 20:49
  • 498

C#实现图片自由变换 任意扭曲的算法

之前想过要做个地铁驾驶的游戏,其中想把一些原本是矩形图片弄成一个梯形,但是发现GID+上面没有类似的方法。于是在谷歌谷了一下。没有!只能找到令人垂涎的,并没有源码。按照自己的想法尝试了一两天,有点效果...
  • form88
  • form88
  • 2015年06月17日 15:46
  • 1971

Core Graphics核心绘图 ( 一)

1)什么是 Graphics(核心绘图) Core Graphics 是核心绘图框架,其中的 Quartz 2D API 专门提供图形绘制工作 所有 UIKit 的底层渲染工作都是由 Core Gra...

UIKit和Core Graphics绘图——构造路径,阴影以及渐变扩展

构造路径 通常,一系列点组合一起构成一个形状,而若干个形状组合在一起可以构造一个路径,路径可以规则也可以不规则,随意组合。通过Core Graphics很容易管理路径。 主要用到的函数或方法:...
  • ran0809
  • ran0809
  • 2013年08月17日 02:27
  • 4004

Swift - Core Graphics绘图框架详解4(绘制图片、图形变换)

一、绘制图像 Core Graphics 也是支持绘制图片图像的,而且 UIKit 中对这个做了封装,方便我们使用。 1,绘制到指定的矩形中 使用这种方式的话图片会自动进行拉伸。如果矩形比...

Swift- Core Graphics绘图框架详解2(绘制图形)

1,绘制矩形 import UIKit   class ViewController: UIViewController {           override func v...

UIKit和Core Graphics绘图——绘制光泽,仿射变换与矩阵变换

绘制光泽 在一个矩形上绘制光泽其实可以通过在原有色彩的基础上绘制一层透明度较高的渐变来实现。首先先看以前绘制渐变的函数。 void drawLinearGradient(CGContextRe...
  • ran0809
  • ran0809
  • 2013年08月19日 21:33
  • 2805

核心绘图——Core Graphics

一. Core Graphics简介 Core Graphics是一个基于C的绘图专用的API族,它经常被称为QuartZ或QuartZ 2D,是一个二维绘图引擎,同时支持iOS和Mac系统。它提...

Core Graphics核心绘图 ( 三) --贝塞尔曲线

1)UIBezierPath(贝塞尔曲线) 在自定义View的时候,可以使用贝塞尔曲线(UIBezierPath)类来实现直线和曲线的绘制和渲染,起初是使用贝塞尔曲线是定义路径的几何形状。贝塞尔曲...

使用Core Graphics 进行iOS绘图

Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:媒体层:Core Graphics(绘图)
举报原因:
原因补充:

(最多只允许输入30个字)