Quartz绘图使用示例

概要

本章主要简示了使用IOS的绘图Quartz,包括简单的画直线、图片、文字、圆、矩形、贝塞尔曲线,包括一些基本使用方法。

结果展示

流程概要

1.绘图好像直接在UIView类里面绘制的,在控制类里面绘制没有尝试。

2.新建一个基于UIView的类,发现新建类里面自动生成了drawRect方法,直接在这个方法里面写代码即可自动被调用

3.注意绘图时是先绘制路径,然后使用画图函数(eg.CGContextDrawPath,CGContextFillPath等)才能在界面上显示。

主要代码

基于UIView的类的m文件

//
//  MyView.m
//  CustomDraw
//
//  Created by arbboter on 14/12/18.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "MyView.h"

@interface MyView ()

@property (nonatomic, readwrite) CGRect myFrame;

@end

@implementation MyView

- (void) setMyFrame
{
    CGFloat x = self.frame.origin.x;
    CGFloat y = self.frame.origin.y;
    CGFloat w = self.frame.size.width;
    CGFloat h = self.frame.size.height;

    x = x + 5;
    y = y + 20 ;
    w = w - 10;
    h = h - 25;

    _myFrame = CGRectMake(x, y, w, h);
}

/** 该方法是UIView内置方法 */
- (void) drawRect:(CGRect)rect
{
    // 设置绘图区域
    [self setMyFrame];

    /** 画图 */
    NSString* filePath = [[NSBundle mainBundle] pathForResource:@"sad" ofType:@"jpeg"];
    UIImage* image = [[UIImage alloc] initWithContentsOfFile:filePath];
    [image drawAtPoint:CGPointMake(self.frame.origin.x, self.frame.origin.y)];
    [image release];
    image = nil;

    /** 写字(设置字体大小及颜色) */
    NSArray* array = [UIFont familyNames];
    UIFont* font = [UIFont fontWithName:[array objectAtIndex:35] size:42];
    NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName,
                          [UIColor blueColor], NSForegroundColorAttributeName,
                          nil];
    NSString* title = [[NSString alloc] initWithString:@"正余弦曲线"];
    [title drawAtPoint:CGPointMake(95, 35) withAttributes:dict];
    [dict release];
    dict = nil;

    CGFloat x = self.myFrame.origin.x;
    CGFloat y = self.myFrame.origin.y;
    CGFloat w = self.myFrame.size.width;
    CGFloat h = self.myFrame.size.height;

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    /** ==画矩形框== */
    /** 设置路径 */
    CGContextMoveToPoint(ctx, x, y);
    CGContextAddLineToPoint(ctx, x + w, y);
    CGContextAddLineToPoint(ctx, x + w, y + h);
    CGContextAddLineToPoint(ctx, x, y + h);
    CGContextAddLineToPoint(ctx, x, y);

    /** 设置画图颜色 */
    [[UIColor blackColor] setStroke];

    /** 设置画笔大小 */
    CGContextSetLineWidth(ctx, 2.0);

    /** 根据设置的路径画路径 */
    CGContextStrokePath(ctx);

    /** ==画矩形块== */
    /* 设置路径  */
    CGContextMoveToPoint(ctx, x + w - 50, y + 5);
    CGContextAddLineToPoint(ctx, x + w - 10, y + 5);
    CGContextAddLineToPoint(ctx, x + w - 10, y + 45);
    CGContextAddLineToPoint(ctx, x + w - 50, y + 45);
    /* 可选择自己绘制闭合路径, 也可使用CGContextClosePath自动绘制 */
#if 0
    /* 绘制闭合路径 */
    CGContextAddLineToPoint(ctx, x + 5, y + 5);
#else
    /** 自动绘制闭合路径 */
    CGContextClosePath(ctx);
#endif

    /* 设置绘图画笔颜色 */
    [[UIColor yellowColor] setStroke];
    /* 设置绘图填充颜色 */
    [[UIColor redColor] setFill];
    /** 设置画笔大小 */
    CGContextSetLineWidth(ctx, 1.0);

    /* 绘制方式绘画
     * kCGPathFillStroke -> 填充+描边
     * kCGPathFill       -> 填充
     * kCGPathStroke     -> 描边
     */
    CGContextDrawPath(ctx, kCGPathFillStroke);

    /** ==画下边框的圆还== */

    CGFloat r1 = 12;
    CGFloat r2 = 6;
    CGFloat x1 = x + r1 + 2;
    CGFloat y1 = y + h - r1 -2;

    for (CGFloat xMax=x1+r1; xMax < x + w; xMax=x1+r1)
    {
        /** 通过先绘制大圆,然后再绘制和背景色相同的小圆实现圆环绘制 */
        /** 移动到圆周上一点,不然会把当前圆和之前的最后点连接起来 */
        CGContextMoveToPoint(ctx, x1+r1, y1);

        /* 绘制大圆路径 */
        CGContextAddArc(ctx, x1, y1, r1, 0, M_PI*2, 0);

        /* 设置颜色 */
        CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor]));
        CGContextSetStrokeColor(ctx, CGColorGetComponents([[UIColor greenColor] CGColor]));

        /** 绘制图形 */
        CGContextDrawPath(ctx, kCGPathFillStroke);

        /** 移动到圆周上一点 */
        CGContextMoveToPoint(ctx, x1+r2, y1);

        /** 绘制小圆路径 */
        CGContextAddArc(ctx, x1, y1, r2, 0, M_PI*2, 0);

        /** 设置小圆填充颜色[颜色值用系统自带的数码测色器获取背景色] */
        [[UIColor colorWithRed:170.0/255 green:166.0/255 blue:102.0/255 alpha:1.0] setFill];

        /** 绘制图形 */
        CGContextFillPath(ctx);

        x1 += (2*r1+2);
    }

    [self drawCoordinate];
    [self drawSin];

}
/** 绘制坐标轴 */
- (void) drawCoordinate
{
    CGFloat x = self.myFrame.origin.x;
    CGFloat y = self.myFrame.origin.y;
    CGFloat w = self.myFrame.size.width;
    CGFloat h = self.myFrame.size.height;

    /* 坐标系原点 */
    CGFloat x1 = x + 5 + 20;
    CGFloat y1 = y + h - 40;

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    /** 设置绘图颜色 */
    CGContextSetStrokeColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextSetLineWidth(ctx, 3.0);

    /** 设置标准字体 */
    /** 写字(设置字体大小及颜色) */
    NSArray* array = [UIFont familyNames];
    UIFont* font = [UIFont fontWithName:[array objectAtIndex:1] size:12];
    NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName,
                          [UIColor redColor], NSForegroundColorAttributeName,
                          nil];

    /** 先绘制坐标 */
    CGContextMoveToPoint(ctx, x1, y1);

    /** 横坐标系 */
    CGContextAddLineToPoint(ctx, x + w, y1);
    CGContextStrokePath(ctx);

    /* 绘制尺寸标注 */
    CGFloat h1 = 0;
    NSInteger wid = 20;
    for (NSInteger x2= x1+wid; x2 < x1 + w; x2+=wid)
    {
        NSInteger num = (x2 - x1)/wid;
        if( num%2 )
        {
            h1 = 4;
            CGContextSetLineWidth(ctx, 1.0);
        }
        else
        {
            h1 = 6;
            CGContextSetLineWidth(ctx, 2.0);

            NSString* strNum = [[NSString alloc] initWithFormat:@"%ld", num/2];
            [strNum drawAtPoint:CGPointMake(x2, y1) withAttributes:dict];
            [strNum release];
        }

        CGContextMoveToPoint(ctx, x2, y1-2);
        CGContextAddLineToPoint(ctx, x2, y1-h1);
        CGContextStrokePath(ctx);
    }

    /** 纵坐标系 */
    CGContextSetStrokeColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextSetLineWidth(ctx, 3.0);
    CGContextMoveToPoint(ctx, x1, y1+1.5);
    CGContextAddLineToPoint(ctx, x1, y);
    CGContextStrokePath(ctx);

    /* 绘制尺寸标注 */
    for (NSInteger y2=y1-wid; y2 > y; y2-=wid)
    {
        NSInteger num = (y1 - y2)/wid;
        if( num%2 )
        {
            h1 = 4;
            CGContextSetLineWidth(ctx, 1.0);
        }
        else
        {
            h1 = 6;
            CGContextSetLineWidth(ctx, 2.0);

            if (num>1)
            {
                NSString* strNum = [[NSString alloc] initWithFormat:@"%ld", num/2];
                [strNum drawAtPoint:CGPointMake(x1-20, y2-6) withAttributes:dict];
                [strNum release];
            }
        }

        CGContextMoveToPoint(ctx, x1+2, y2);
        CGContextAddLineToPoint(ctx, x1+h1, y2);
        CGContextStrokePath(ctx);
    }

    [dict release];
    dict = nil;
}

- (void) drawSin
{
    /** 使用二阶贝塞尔曲线模拟正余弦 */
    CGFloat x = self.myFrame.origin.x;
    CGFloat y = self.myFrame.origin.y;
    CGFloat w = self.myFrame.size.width;
    CGFloat h = self.myFrame.size.height;

    /* 坐标系原点 */
    CGFloat x1 = x + 5 + 20;
    CGFloat y1 = y + h - 40;
    CGFloat w1 = 20;
    CGFloat h1 = 200;

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    /** 正弦 */
    CGContextSetStrokeColorWithColor(ctx, [[UIColor redColor] CGColor]);
    CGFloat yShift = -300;
    for (CGFloat x2=x1-2*w1; x2<x+w; x2+=2*w1)
    {
        h1 *= -1;
        CGContextMoveToPoint(ctx, x2, y1+yShift);
        CGContextAddQuadCurveToPoint(ctx, x2+w1, y1-h1+yShift, x2+2*w1, y1+yShift);
        CGContextStrokePath(ctx);
    }

    /** 余弦 */
    CGContextSetStrokeColorWithColor(ctx, [[UIColor yellowColor] CGColor]);
    for (CGFloat x2=x1-w1; x2<x+w; x2+=2*w1)
    {
        CGContextMoveToPoint(ctx, x2, y1+yShift);
        CGContextAddQuadCurveToPoint(ctx, x2+w1, y1-h1+yShift, x2+2*w1, y1+yShift);
        CGContextStrokePath(ctx);

        h1 *= -1;
    }

    /** 给曲线加个基线 */
    /** 分别指定虚线的小实线和空白的长度 */
    CGFloat fpDash[] = {5,5};
    CGContextSetStrokeColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextSetLineWidth(ctx, 1.0);
    /** 设置画线格式为虚线:参数含义
     * context – 这个不用多说
     * phase参数表示在第一个虚线绘制的时候跳过多少个点
     * lengths – 指明虚线是如何交替绘制,上面的数组fpDash
     * count – lengths数组的长度
     */
    CGContextSetLineDash(ctx, 0, fpDash, 2);
    CGContextMoveToPoint(ctx, 0, y1+yShift);
    CGContextAddLineToPoint(ctx, x+w, y1+yShift);
    CGContextStrokePath(ctx);

    /** 文字标注 */

    /** 写字(设置字体大小及颜色) */
    NSArray* array = [UIFont familyNames];
    UIFont* font = [UIFont fontWithName:[array objectAtIndex:20] size:16];
    NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName,
                          [UIColor redColor], NSForegroundColorAttributeName,
                          nil];
    NSString* title = [[NSString alloc] initWithString:@"----正弦曲线"];
    [title drawAtPoint:CGPointMake(x + w - 100, y + h/8) withAttributes:dict];
    [dict release];
    dict = nil;

    dict = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName,
            [UIColor yellowColor], NSForegroundColorAttributeName,
            nil];
    title = [[NSString alloc] initWithString:@"----余弦曲线"];
    [title drawAtPoint:CGPointMake(x + w - 100, y + h/8 + 30) withAttributes:dict];
    [dict release];
    dict = nil;

}
@end

项目工程

时间: 2024-11-15 22:58:10

Quartz绘图使用示例的相关文章

数据分析与展示——Matplotlib基础绘图函数示例

Matplotlib库入门 Matplotlib基础绘图函数示例 pyplot基础图表函数概述 函数 说明 plt.plot(x,y,fmt, ...) 绘制一个坐标图 plt.boxplot(data,notch,position) 绘制一个箱体图 plt.bar(left,height,width,bottom) 绘制一个条形图 plt.barh(width,bottom,left,height) 绘制一个横向条形图 plt.polar(theta,r) 绘制极坐标图 plt.pie(dat

Quartz(1)--简单示例

Quartz 是一个企业级调度工作的框架,帮助Java应用程序到调度工作/任务在指定的日期和时间运行,本文的Quartz版本为2.2.1. 1. Quartz 作业 job Quartz作业定义要运行什么,实现Job接口中的execute方法 package com.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; publi

quartz + spring 配置示例

<!-- 配置job定时任务类 --> <bean id="triggerCalculateLecturerProfitJob" class="com.itzixi.quartz.job.CalculateLecturerProfitJob"></bean> <!-- 配置jobDetail --> <bean id="triggerCalculateLecturerProfitJobMethod&qu

iOS 使用Quartz和OpenGL绘图

http://blog.csdn.net/coder9999/article/details/7641701 第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库.OpenGL ES是跨平台图形库OpenGL的简化版.OpenGL ES是OpenGL的一个子集,OpenGL ES是专门为iPhone之类的嵌入式系统(因此缩写字母为“ES”)设计的. 1

[转] 使用Quartz 2D和OpenGLES绘图

有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库.OpenGL ES是跨平台图形库OpenGL的简化版.OpenGL ES是OpenGL的一个子集,OpenGL ES是专门为iPhone之类的嵌入式系统(因此缩写字母为“ES”)设计的. 12.1 图形世界的两个视图Quartz是一组函数.数据类型以及对象,专门设计用于直接在内存中对视图或图像进行控制.Quartz将正在绘制的视图或图像视为一个

C#使用Quartz.NET详细讲解

Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等. 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行.一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,

HTML学习总结(四)【canvas绘图、WebGL、SVG】

一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 SVG以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图.SVG 绘图很容易编辑与生成,但功能明显要弱一些. canvas可以完成动画.游戏.图表.图像处理等原来需要Flash完成的一

iOS开发——图形编程OC篇&amp;(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

ios绘图时的坐标处理

在iOS中,进行绘图操作时,一般主要是在UIView:drawRect中调用 UIGraphicsBeginImageContextWithOptions等一系列函数,有时候直接画图就行,比如UIImage的drawRect等,有时候需要进行稍微复杂的操作,比如颜色混合,mask等,需要对CGContextRef进行CTM变换,通过今天查阅资料了解到: UIKit和Quartz 绘图的坐标系统是不一样的,前者原点为左上,后者为左下. 如果是直接使用UIKit的方法进行调用绘图上下文CGConte