博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz 2D基本图形的绘制
阅读量:4079 次
发布时间:2019-05-25

本文共 5156 字,大约阅读时间需要 17 分钟。

基本步骤:

1.获取绘图上下文

2.创建并设置路径

3.将路径添加到上下文

4.设置上下文状态

5.绘制路径

6.释放路径

#import "YGView.h"

//屏幕尺寸
#define kScreenSize [UIScreen mainScreen].bounds.size
//屏幕宽高定义
#define kscreenWidth   [[UIScreen mainScreen] bounds].size.width
#define kScreenHeight  [[UIScreen mainScreen] bounds].size.height
@implementation YGView
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGContextRef  context=UIGraphicsGetCurrentContext();
//    [self drawLine1:context];
//    [self drawLine2:context];
//    [self drawArc:context];
//    [self drawCurve:context];
//    [self drawImage:context];
//    [self drawImageChangeContext:context];
    [self drawImage1:context];
}
-(void)drawLine1:(CGContextRef)context{
    CGMutablePathRef path=CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 20, 50);//移动到指定位置(设置路径起点)
    CGPathAddLineToPoint(path, nil, 20, 100);//绘制直线(从起始位置开始)
    CGPathAddLineToPoint(path, nil, 200, 100);//绘制另一条直线(从上一条直线的终点开始)
    CGContextAddPath(context, path);
    CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);//设置直线颜色
    CGContextSetRGBFillColor(context, 0, 1.0, 0, 1);//设置填充颜色
    CGContextSetLineWidth(context, 2.0);//设置直线宽度
    CGContextSetLineCap(context, kCGLineCapRound);//设置顶点样式
    CGContextSetLineJoin(context, kCGLineJoinRound);//设置连接点样式
    CGFloat lengths[2]={18,9};
    CGContextSetLineDash(context, 0, lengths, 2);
    CGContextDrawPath(context, kCGPathFillStroke);//最后一个参数是填充类型
    /*CGPathDrawingMode是填充方式,枚举类型
     kCGPathFill:只有填充(非零缠绕数填充),不绘制边框
     kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)
     kCGPathStroke:只有边框
     kCGPathFillStroke:既有边框又有填充
     kCGPathEOFillStroke:奇偶填充并绘制边框
     */
    CGPathRelease(path);
}
-(void)drawLine2:(CGContextRef)context{
    CGContextMoveToPoint(context, 20, 150);
    CGContextAddLineToPoint(context, 20, 200);
    CGContextAddLineToPoint(context, 200, 200);
    //封闭路径
    CGContextClosePath(context);
    [[UIColor redColor] setStroke];//设置红色边框
    [[UIColor greenColor] setFill];//设置填充颜色
    //[[UIColor blueColor]set];//同时设置填充和边框色
    CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark 绘制矩形
-(void)drawRectWithContext:(CGContextRef)context{
    //添加矩形对象
    CGRect rect=CGRectMake(20, 50, 280.0, 50.0);
    CGContextAddRect(context,rect);
    //设置属性
    [[UIColor blueColor]set];
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制椭圆
-(void)drawEllipse:(CGContextRef)context{
    CGRect rect=CGRectMake(50, 50, 220, 200);
    CGContextAddEllipseInRect(context, rect);
    //设置属性
    [[UIColor greenColor] set];
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制弧线
-(void)drawArc:(CGContextRef)context{
//    CGContextAddArc(CGContextRef  _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
    /*  添加弧线对象
        x:中心点x坐标
        y:中心点y坐标
        radius:半径
        startAngle:起始弧度
        endAngle:终止弧度
        clockwise:是否逆时针绘制,0为顺时针绘制
     */
    CGContextAddArc(context, 160, 160, 100, 0, M_PI*0.2, 0);
    //设置属性
    [[UIColor redColor] setStroke];
    [[UIColor yellowColor] setFill];
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制贝塞尔曲线
-(void)drawCurve:(CGContextRef)context{
    CGContextMoveToPoint(context, 20, 100);
//    CGContextAddQuadCurveToPoint(CGContextRef  _Nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
    /*绘制二次贝塞尔曲线
        c:图形上下文
        cpx:控制点x坐标
        cpy:控制点y坐标
        x:结束点x坐标
        y:结束点y坐标
     */
    CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100);
    
    CGContextMoveToPoint(context, 20, 500);
//    CGContextAddCurveToPoint(CGContextRef  _Nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
    /*绘制三次贝塞尔曲线
        c:图形上下文
        cp1x:第一个控制点x坐标
        cp1y:第一个控制点y坐标
        cp2x:第二个控制点x坐标
        cp2y:第二个控制点y坐标
        x:结束点x坐标
        y:结束点y坐标
     */
    CGContextAddCurveToPoint(context, 80, 300, 240, 500, 300, 300);
    
    //设置图形上下文属性
    [[UIColor yellowColor]setFill];
    [[UIColor redColor]setStroke];
    
    //绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 图像绘制
-(void)drawImage:(CGContextRef)context{
    UIImage *image=[UIImage imageNamed:@"test1"];
    //从某一点开始绘制
//    [image drawAtPoint:CGPointMake(10, 50)];
    //绘制到指定的矩形中,注意如果大小不合适会会进行拉伸
    [image drawInRect:CGRectMake(20, 20, 300, 300)];
    //平铺绘制
//    [image drawAsPatternInRect:CGRectMake(20, 20, 300, 300)];
}

#pragma mark - 图形上下文变换

-(void)drawImageChangeContext:(CGContextRef)context{
    //保存初始状态
    CGContextSaveGState(context);
    //1.图形上下文向右平移40
    CGContextTranslateCTM(context, 60, 40);
    //2.缩放0.5
    CGContextScaleCTM(context, 0.5, 0.5);
    //3.旋转
    CGContextRotateCTM(context, M_PI_4/4);
    UIImage *image=[UIImage imageNamed:@"test1"];
    [image drawInRect:CGRectMake(20, 50, 300, 300)];
    //恢复到初始化状态
    CGContextRestoreGState(context);
}
#pragma mark - 使用Core Graphics绘制图像
-(void)drawImage1:(CGContextRef)context{
//    UIImage *image=[UIImage imageNamed:@"test1"];
//    //图像绘制
//    CGRect rect=CGRectMake(20, 50, 300, 300);
//    CGContextDrawImage(context, rect, image.CGImage);
//    ///以上代码图像会倒过来
    UIImage *image=[UIImage imageNamed:@"test1"];
    CGContextSaveGState(context);
    CGFloat height=300,y=50;
    //上下文形变
    CGContextScaleCTM(context, 1, -1);//在Y轴缩放-1相当于沿着X轴旋转180度;注意不要沿着z轴旋转,这样得不到想要的结果
    CGContextTranslateCTM(context, 0, -(kScreenHeight-(kScreenHeight-height-2*y)));//向上平移
    //图像绘制
    CGRect rect=CGRectMake(10, y, 300, height);
    CGContextDrawImage(context, rect, image.CGImage);
    
    CGContextRestoreGState(context);
}
@end

转载地址:http://rjsni.baihongyu.com/

你可能感兴趣的文章
JTAG、JLINK、ULINK、ST-LINK的联系和区别
查看>>
*玩无人机很明显的一点就是理论和实践相差很大(考研,找工作也是的)
查看>>
无人机光流模块的选择
查看>>
不一定超声波测高,还可以激光测高
查看>>
现在发现如果无人机的电机不同,浆可能是不能混用的。
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
F330装GPS的位置
查看>>
GPS模块我一般看到的是M8N这个型号
查看>>
STM32时钟系统
查看>>
我想先用三个或者五个激光测距做无人机的室内定位和避障
查看>>
pixhawk也可以用Airsim仿真
查看>>
《无人机电机与电调技术》可以看看
查看>>
我发现七月在线的GAAS课程基本都讲到了
查看>>
电机堵转
查看>>
一个真正好的无人机应该是需要自己慢慢去调参的,别人的默认参数是可以飞但是可能达不到perfect的效果。
查看>>
carzepony也在想往FreeRTOS上迁移
查看>>
可以买个好点的电烙铁
查看>>
ACfly调参记录(包括ACfly-F330和ACfly-T265)
查看>>
一定记得每飞几次或者隔一天要把螺丝和浆帽拧一次,确实会松的
查看>>