iOS之UI高级---Quartz2D基本使用(1)

本文深入探讨了Quartz2D作为iOS应用开发中用于二维图形绘制的引擎,其特点包括与分辨率和设备无关的特性,以及如何在内存管理上遵循C语言原则。同时,文章详细解释了Quartz2D的坐标系转换,对比了`setNeedsLayout`和`setNeedsDisplay`的方法,并提供了绘制直线和图片图形的具体代码示例。

一:Quartz 2D介绍:

①二维图形绘制引擎,支持iOS环境和Mac OS X环境
②是CoreGraphics框架的一部分,其中的很多数据类型和方法都是CG开头。会经常见到Quartz 2D和CoreGraphics两个术语交互使用
③Quartz与分辨率和设备无关,所以绘制的时候不需要考虑最终绘图的目标和设备。

(2)Quartz内存管理:
①使用含有“Create”或”Copy”的函数创建的对象,使用完后必须释放。(这符合C语言中申请内存,释放内存的原则)

(3)Quartz 2D的坐标系:
①默认的坐标系统:原点(0,0)在左下角。
②iOS的UIKit框架的坐标系中,原点在左上角
所以要进行坐标转换:(请见下文代码示例中的:绘制图形图片)

(4)drawRect和layoutSubViews的对比
setNeedsLayout:异步调用layoutSubViews(布局子视图)
setNeedsDisplay:异步调用drawRect(绘图)

代码示例

①绘制直线:(新建UIView类,实现如下主要方法。至于矩形、圆、贝塞尔曲线的绘制方法大同小异,不一一举例)

绘制方法:
-(void) drawRect:(CGRect)rect {
    //1.直接获取图形上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self drawLine:context];
}
//①基本绘制方法
-(void) drawLine:(CGContextRef)context {
    //2.创建图形路径
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 50, 50); //起点
    CGPathAddLineToPoint(path, NULL, 100, 100); //增加点
    CGPathAddLineToPoint(path, NULL, 50, 100);

    CGPathCloseSubpath(path); //连接首尾点,闭合视图(可选)
    //3.将路径添加到图形上下文
    CGContextAddPath(context, path);
    //4.设置图形属性
    CGContextSetRGBStrokeColor(context, 0, 1, 0, 1);
    CGContextSetRGBFillColor(context, 1, 0, 0, 1);
    CGContextSetLineWidth(context, 3);
    //5.绘制
    CGContextDrawPath(context, kCGPathFillStroke);
    //6.释放路径
    CGPathRelease(path);
}

//②绘制常用方法(简便)
-(void) drawLine2:(CGContextRef) context {
    CGPoint points[] = {{50,50}, {200, 200}, {50, 200}, {50, 50}};
    CGContextAddLines(context, points, 4);

    [[UIColor redColor] setStroke];
    [[UIColor greenColor] setFill];
    CGContextSetLineWidth(context, 3);

    CGContextDrawPath(context, kCGPathFillStroke); 
}

②绘制图片图形

-(void) drawImage:(CGContextRef) context {
    //1.创建UIImage
    UIImage *image = [UIImage imageNamed:@"ali.jpg"];
//    2.坐标转化
//        (1)保存图形上下文,确保绘制的内容不变形
    CGContextSaveGState(context);
//        (2)转换左边系
    //翻转图形
    CGContextScaleCTM(context, 1, -1);
    //把翻转后的图形移回原位
    CGContextTranslateCTM(context, 0, -image.size.height);
//        (3)绘制:UIImage类切记要转换成CG类
    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); 
//        (4)恢复context
    CGContextRestoreGState(context);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值