学习笔记-quartz2D

一、简介                                                                           

  quartz2D是属于core Graphic框架,该框架是基于C的API。quartz2D用于绘制平面图形。

二、例程步骤

  1. 添加UIView的子类MyView,在MyView.m中实现如下方法:

    1 #pragma mark 在这个方法内部进行绘图
    2 - (void)drawRect:(CGRect)rect {
    3 4 }
    

      

  2. 在该方法内部绘图;
  3. 在control.m中新建MyView的对象并添加到self.view中;

三、绘图功能

  1.  1 #pragma mark 画线
     2 void drawLine() {
     3     // 取得当前的图形上下文
     4     CGContextRef context = UIGraphicsGetCurrentContext();
     5
     6     // 构建一个路径
     7     CGContextBeginPath(context);
     8
     9     // 先设置一个起点
    10     CGContextMoveToPoint(context, 50, 50);
    11
    12     // 从(50,50)连线到(100,100)
    13     CGContextAddLineToPoint(context, 100, 100);
    14
    15     // 从(100,100)连线到(150,50)
    16     CGContextAddLineToPoint(context, 150, 50);
    17
    18     // 从(150,50)连线到(150,50)
    19     CGContextAddLineToPoint(context, 200, 100);
    20
    21
    22     // 设置线条颜色(红色)
    23     // #ffff0000
    24     CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
    25
    26     // 同时设置stroke和fill的颜色
    27     // [[UIColor blueColor] set];
    28
    29     // 会覆盖前面设置的颜色
    30     [[UIColor blueColor] setStroke];
    31
    32     // 设置线宽
    33     CGContextSetLineWidth(context, 20);
    34
    35     //kCGLineCapButt,
    36     //kCGLineCapRound,
    37     //kCGLineCapSquare
    38     // 设置线条 头部 和 尾部的样式
    39     CGContextSetLineCap(context, kCGLineCapRound);
    40     // kCGLineJoinMiter,
    41     // kCGLineJoinRound,
    42     // kCGLineJoinBevel
    43     // 设置线段连接点的样式
    44     CGContextSetLineJoin(context, kCGLineJoinRound);
    45
    46     [[UIColor redColor] setStroke];
    47
    48     // 先设置一个起点
    49     CGContextMoveToPoint(context, 50, 100);
    50
    51     // 从(50,50)连线到(100,100)
    52     CGContextAddLineToPoint(context, 100, 150);
    53
    54     // 从(100,100)连线到(150,50)
    55     CGContextAddLineToPoint(context, 150, 100);
    56
    57     // 从(150,50)连线到(150,50)
    58     CGContextAddLineToPoint(context, 200, 150);
    59
    60
    61     // 绘制构建好的路径(stroke是空心的意思)
    62     CGContextStrokePath(context);
    63 }
  2. #pragma mark 画矩形(多边形)
    void drawShape() {
        // 取得当前的图形上下文
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        // 构建一个路径(这句可以不写,默认就会构建一个路径)
        // CGContextBeginPath(context);
    
        /******空心矩形******/
    
        // 添加一个矩形到路径中
        CGRect rect = CGRectMake(40, 100, 100, 100);
        CGContextAddRect(context, rect);
    
        // 设置红色的空心颜色
        [[UIColor redColor] setStroke];
    
        // 绘制构建好的路径
        CGContextStrokePath(context);
    
        /******实心矩形******/
        // 设置实心颜色
        [[UIColor blueColor] setFill];
        // 添加矩形到路径中
        CGContextAddRect(context, CGRectMake(100, 250, 80, 80));
        // 绘制构建好的路径
        CGContextFillPath(context);
    
        /******画三角形******/
        // 设置起点
        CGContextMoveToPoint(context, 170, 20);
        // 连线到下一个点
        CGContextAddLineToPoint(context, 250, 50);
        // 连线到下一个点
        CGContextAddLineToPoint(context, 200, 70);
        // 合并路径,将起点和终点连接在一起
        CGContextClosePath(context);
    
        // 设置实心颜色为绿色
        [[UIColor greenColor] setFill];
    
        // 绘制路径
        CGContextFillPath(context); //实心
        // CGContextStrokePath(context); // 空心
    
        /***直接画一个空心矩形***/
        [[UIColor yellowColor] setStroke];
        CGContextStrokeRect(context, CGRectMake(10, 10, 50, 50));
        // 直接画一个实心矩形
        // CGContextFillRect(<#CGContextRef c#>, <#CGRect rect#>)
    }
  3. #pragma mark 画椭圆
    void drawCircle() {
        // 取得当前的图形上下文
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        /***画椭圆***/
        // 添加椭圆到路径中
        CGContextAddEllipseInRect(context, CGRectMake(10, 10, 100, 50));
        // 绘制空心路径
        // CGContextStrokePath(context);
        // 绘制实心路径
        CGContextFillPath(context);
    
        /***直接画椭圆***/
        CGContextStrokeEllipseInRect(context, CGRectMake(10, 70, 150, 100));
    
        /***画圆***/
        CGContextStrokeEllipseInRect(context, CGRectMake(10, 170, 50, 50));
    
        /**画圆弧**/
        // 180 - PI
        // 90 - PI/2
        // 0 - 0
        // NO代表顺时针
        // YES代表逆时针
        CGContextAddArc(context, 250, 100, 40, 0, M_PI_2, NO);
        CGContextFillPath(context);
    
        /*画左半圆*/
        CGContextAddArc(context, 250, 200, 40, -M_PI_2, M_PI_2, YES);
        CGContextFillPath(context);
    
        /*画复杂圆弧*/
        CGContextMoveToPoint(context, 10, 260);
        CGContextAddArcToPoint(context, 100, 200, 150, 230, 40);
        CGContextStrokePath(context);
    }
  4. #pragma mark 画文字
    - (void) drawText {
        // 取得当前的图形上下文
        CGContextRef context = UIGraphicsGetCurrentContext();
        [[UIColor redColor] setFill];
        CGRect rect = CGRectMake(50, 50, 150, 150);
        CGContextFillRect(context, rect);
    
        [[UIColor blueColor] setFill];
        NSString *str = @"I am a word!!!I am a word!!!I am a word!!!I am a word!!!I am a word!!!I am a word!!!";
    
        UIFont *font = [UIFont systemFontOfSize:20];
        //[str drawAtPoint:CGPointMake(0, 0) withFont:font];
    
        // 限制文字的宽度
        CGFloat width = self.bounds.size.width;
        // 不允许换行
        [str drawAtPoint:CGPointMake(0, 0) forWidth:100 withFont:font lineBreakMode:NSLineBreakByCharWrapping];
    
        // 运行换行
        // NSLineBreakByWordWrapping换行的时候会保留一个完整的单词
        // NSLineBreakByCharWrapping只会保留一个字符
        //[str drawInRect:rect withFont:font lineBreakMode:NSLineBreakByCharWrapping];
    
        [str drawInRect:rect withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
    }
  5. #pragma mark 画图片
    void drawImage() {
        UIImage *image = [UIImage imageNamed:@"lufy.png"];
    
        [image drawAtPoint:CGPointMake(0, 0)];
    
        // 会对图片进行自动拉伸
        [image drawInRect:CGRectMake(100, 0, 200, 200)];
    
        // 平铺图片
        [image drawAsPatternInRect:CGRectMake(0, 220, 320, 250)];
    }
  6. #pragma mark 整体操作
    void drawAll() {
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        // 缩放
        CGContextScaleCTM(context, 0.5, 0.5);
        // 平移
        CGContextTranslateCTM(context, 100, 0);
        // 旋转
        CGContextRotateCTM(context, -45);
    
        drawShape();
    }

      

学习笔记-quartz2D,布布扣,bubuko.com

时间: 2024-10-13 15:59:16

学习笔记-quartz2D的相关文章

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl