iphone中Quarz 2D的使用

1.可以依靠两个不同的库来满足我们绘图的需要,一个库是Quartz 2D,它是Core Graphics框架的一部分;另一个库是OpenGL ES,它是跨平台的图形库。

2.OpenGL ES是跨平台图形库OpenGL的简化版、OpenGL ES是OpenGL的一个子集,OpenGL ES是专为iphone之类的嵌入式系统(因此缩写为字母ES)设计的。

3.Quartz是一组函数、数据类型以及对象,专门用于直接在内存中对视图或图像进行绘制。Quartz将正在绘制的视图或图像视为一个虚拟的画布,并遵循所谓的绘画者模型。

4.OpenGL ES以状态机的形式实现,OpenGL ES不允许执行直接影响视图、窗口或图像的操作,它维护一个虚拟的三维世界。当向这个世界中添加对象时,OpenGL会跟踪所有对象的状态

5.Quartz相对比较容易使用。它提供了各种直线、形状以及图像绘制函数。尽管易于使用,但Quartz 2D仅限于二维绘图。尽管许多Quartz函数会在绘图时利用硬件加速,但无法保证在Quartz中执行的任何操作都得到了加速。

6.尽管OpenGL非常复杂,并且概念上也比较难理解,但是它的强大性是毫无疑问的。它同时提供了二维和三维绘图工具。他经过专门设计,目的是为了充分利用硬件加速。它还非常适用于编写游戏和其他复杂的、图形密集的程序。

7.使用Quartz绘制图形时,通常会向绘制图形的视图中添加绘图代码。例如,可能会创建UIView的子类。并向该类的drawRect:方法中添加Quartz函数调用。drawRect:方法是UIView类定义的一部分,并且每次需要重绘视图时都会调用该方法。如果在drawRect:中插入Quartz代码,则会先调用改代码,然后重绘视图。

7.在Quartz 2D中,和在其他Core Graphics中一样,绘图是在图形上下文中进行的,通常,只称为上下文。

8下面这行代码将检索当前上下文:

            CGContextRef context=UIGraphicsGetCurrentContext();

9.我们使用Core Graphics C函数,而不是使用Objective-C对象来绘图。Core Graphics和OpenGL都是基于C的API的,因此大多数代码将由C函数调用组成。

10.在Core Graphics中,有两种颜色与绘图操作关联:笔画颜色和填充颜色。笔画颜色用于绘制直线以及形状的轮廓,填充颜色用于填充形状。

11.根据苹果公司发布的“iPhone人机界面指南”,导航栏是专门放在屏幕顶部的,而工具栏则是专门放在底部的。

11.如果想在iphone应用程序中,使用Quartz来绘制图形,需要在view中添加drawRect方法。drawRect方法是系统的方法

            -(void) drawRect:(CGRect) rect{

                        ……

            }

12. -(void) drawRect:(CGRect *) rect{

            //得到当前上下文

            CGContextRef context=UIGraphicsGetCurrentContext();

            //设置画笔的宽度

            CGContextSetLineWidth(context,2.0);

            //设置画笔的颜色

            CGContextSetStrokeColorWithColor(context, self.currentColor.CGColor);

            //设置画笔的画出图形的填充色

            CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);  

            switch (shapeType) {

                        //绘制直线

                        case kLineShape:

                                    //从哪一点开始

                                    CGContextMoveToPoint(context,firstTouch.x,firstTouch.y);

                                    //到哪一点结束

                                    CGContextAddLineToPoint(context, lastTouch.x,lastTouch.y);

                                    //绘制

                                    CGContextStrokePath(context);

                                    break;

                        //绘制长方形(正方形)

                        case kRectShape:

                                    //在当前用户滑动的文本框内添加一个长方形(正方形)

                                    CGContextAddRect(context, [self getRect]);

                                    //绘制

                                    CGContextDrawPath(context, kCGPathFillStroke);

                                    break;

                        //绘制圆形

                        case kEllipseShape:

                                    //在当前用户滑动的文本框内添加一个圆形

                                    CGContextAddEllipseInRect(context, [self getRect]);

                                    CGContextDrawPath(context, kCGPathFillStroke);

                                    break;

                        //绘制图形 其中drawImage是UIImage类型

                        case kImageShape:{

                                    //设置水平偏移量

                                    CGFloat horizontalOffset=drawImage.size.width/2;

                                    //设置数值偏移量

                                    CGFloat verticalOffset=drawImage.size.height/2;

                                    CGPoint drawPoint=CGPointMake(lastTouch.x-horizontalOffset,lastTouch.y-verticalOffset);

                                    //开始绘制

                                    [drawImage drawAtPoint:drawPoint];

                                    break;}

                        default:

                                    break;

            }

}

以下是代码:

在UIView的子类中添加如下代码
 - (void)drawRect:(CGRect)rect
 {
     //得到当前上下文
     CGContextRef context=UIGraphicsGetCurrentContext();
     //设置画笔的粗细
     CGContextSetLineWidth(context, 2);
     //设置画笔的颜色
     CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
     //设置填充色
     CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
     
     //画线
     [self drawLine:context];
     //画矩形
     [self drawrectShape:context];
     //画圆
     [self drawEllipseShape:context];
     //画图片
     [self drawImage];
     //写字
     [self drawText];
     //画弧形
     [self drawArc:context];
 }
 
 
 //画线
 -(void) drawLine:(CGContextRef) context{
     UIGraphicsPushContext(context);
 
     //将画笔移动至点x=20 y=20
     CGContextMoveToPoint(context, 20, 20);
     //将画笔从点x=20 y=20 移动至点 x=300 y=300
     CGContextAddLineToPoint(context, 300, 300);
     //画线
     CGContextStrokePath(context);
     
     UIGraphicsPopContext();
 }
 
 //画矩形
 -(void) drawrectShape:(CGContextRef) context{
     UIGraphicsPushContext(context);
     //添加一个CGRect为(30, 190, 100, 50)的矩形
     CGContextAddRect(context, CGRectMake(30, 190, 100, 50));
     //画矩形   第二个参数可以为:kCGPathFill,kCGPathEOFill,kCGPathStroke,kCGPathFillStroke,kCGPathEOFillStroke 表示填充的方式
     CGContextDrawPath(context, kCGPathFillStroke);
     UIGraphicsPopContext();
 }
 
 //画圆
 -(void) drawEllipseShape:(CGContextRef) context{
     UIGraphicsPushContext(context);
     //添加一个在矩形CGRect区域(80, 30, 100, 50)中的圆
     CGContextAddEllipseInRect(context, CGRectMake(80, 30, 100, 50));
     CGContextDrawPath(context, kCGPathFillStroke);
     
     UIGraphicsPopContext();
 }
 
 //写字
 -(void) drawText{
     UIFont *font=[UIFont fontWithName:@"Arial" size:16.0];
     
     NSString *str=[[NSString alloc] initWithString:@"大家好!"];
     [[UIColor yellowColor] set];//设置字体颜色
     [str drawAtPoint:CGPointMake(100, 100) withFont:font];
     [str release];
 }
 
 //画图片
 -(void) drawImage{
     UIImage *image=[UIImage imageNamed:@"money.png"];
     [image drawInRect:CGRectMake(20, 100, 100, 100)];
 }
 
 //画弧形
 -(void) drawArc:(CGContextRef) context{
     CGContextBeginPath(context);   
     CGContextSetRGBStrokeColor(context, 0, 1, 0, 1); 
     //第一个参数context为当前上下文,第二个参数和第三个参数为圆心坐标点,第四个参数为半径,
     //第五个参数和第六个参数是开始的弧度和结束的弧度,最后一个参数0表示顺时针,1表示逆时针
     CGContextAddArc(context, 100, 100, 100, 0* PI/ 180, 360* PI/ 180, 0);   
     CGContextStrokePath(context);        
 }

  

原文地址:https://www.cnblogs.com/greywolf/p/2618875.html