zoukankan      html  css  js  c++  java
  • iOS开发-graphics

    CGContextRef的介绍

    在CoreGraphics/CGContext.h 的文件里面有这么一句 typedef struct CGContext *CGContextRef;

    CGContext是封闭类型,无法再详细查看。

    The CGContextRef opaque type represents a Quartz 2D drawing destination. A graphics context contains drawing parameters and all device-specific information needed to render the paint on a page to the destination, whether the destination is a window in an application, a bitmap image, a PDF document, or a printer. You can obtain a graphics context by using Quartz graphics context creation functions or by using higher-level functions provided in the Carbon, Cocoa, or Printing frameworks. Quartz provides creation functions for various flavors of Quartz graphics contexts including bitmap images and PDF. The Cocoa framework provides functions for obtaining window graphics contexts. The Printing framework provides functions that obtain a graphics context appropriate for the destination printer.

    CGContextRef是Quartz 2D的一个绘图上下文。一个绘图上下文包含了绘制参数和所有渲染相关的设备信息,不管目标是应用程序,bitmap图像,PDF文档或者打印机。可以通过Quartz的新建函数创建上下文或者更高级函数提供的上下文。 

    Quartz 提供的bitmap上下文  CGBitmapContextCreate 

    UIGraphics 提供的window上下文 UIGraphicsGetCurrentContext(在drawRect中调用) 

     

    UIKit

    像UIImage、NSString(绘制文本)、UIBezierPath(绘制形状)、UIColor都知道如何绘制自己。这些类提供了功能有限但使用方便的方法来让我们完成绘图任务。

    Core Graphics

    这是一个绘图专用的API族,它经常被称为QuartZ或QuartZ 2D。Core Graphics是iOS上所有绘图功能的基石,包括UIKit。

    获取上下文

    1、drawRect:

    2、drawRect: inContext:

    3、UIGraphicsBeginImageContextWithOptions

    两大绘图框架的支持以及三种获得图形上下文的方法。

    那么我们就有6种绘图的形式。

    下面我们开始实现代码,所有的代码都在这个git上。

    https://github.com/loyinglin/LearnGraphics

    组合1:在drawRect中使用UIKit

    #import "UIKitView.h"
    
    @implementation UIKitView
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect {
        // Drawing code
        UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 10, 50, 50)];
        [[UIColor redColor] setFill];
        [path fill];
    }
    @end

    组合2:在drawRect中使用CoreGraphics

    #import "CoreGraphicsView.h"
    
    @implementation CoreGraphicsView
    // 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();
        CGContextAddEllipseInRect(context, CGRectMake(10, 10, 50, 50));
        CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
        CGContextFillPath(context);
    }
    @end

    组合3:在drawRect: inContext:使用UIKit

    组合4:在drawRect: inContext:使用CoreGraphics

    #import "ViewDelegate.h"
    
    @implementation ViewDelegate
    - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
        NSLog(@"ABC %@", ctx);
        UIGraphicsPushContext(ctx);
        UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 10, 50, 50)];
        
        [[UIColor redColor] setFill];
        [path fill];
        UIGraphicsPopContext();
        

      //以下是使用CoreGrahpics CGContextAddEllipseInRect(ctx, CGRectMake(
    30, 30, 20, 20)); CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor); CGContextFillPath(ctx); } @end

    组合5:在UIGraphicsBeginImageContextWithOptions使用UIKit

    组合6:在UIGraphicsBeginImageContextWithOptions使用CoreGraphics

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            UIGraphicsBeginImageContextWithOptions(self.myImageView.bounds.size, NO, 0);
            UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 10, 50, 50)];
            [[UIColor redColor] setFill];
            [path fill];
            UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.myImageView setImage:image];
            });
            UIGraphicsEndImageContext();
            
            
            UIGraphicsBeginImageContextWithOptions(self.myImageView.bounds.size, NO, 0);
            //core started
            CGContextRef ctx = UIGraphicsGetCurrentContext();
            CGContextAddEllipseInRect(ctx, CGRectMake(10, 10, 20, 20));
            CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
            CGContextFillPath(ctx);
            CGContextFillRect(ctx, CGRectMake(30, 30, 20, 20));
            image = UIGraphicsGetImageFromCurrentImageContext();
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.myImageView2 setImage:image];
            });
            //end
            UIGraphicsEndImageContext();
            
        });

     

    参考

    离屏渲染 http://www.tuicool.com/articles/2iYbMfE

    iOS绘图详细教程 http://www.cocoachina.com/industry/20140115/7703.html

  • 相关阅读:
    [51NOD]大数加法(模拟)
    LCS记录路径
    BISTU-(1)-4-17-2016
    [CF580B]Kefa and Company(滑动窗口)
    [CF660C]Hard Process(尺取法)
    [POJ3061]Subsequence(二分,前缀和)
    [HDOJ2602]Bone Collector(01背包)
    [HDOJ1171]Big Event in HDU(01背包)
    [HDOJ2512]一卡通大冒险(DP)
    hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法
  • 原文地址:https://www.cnblogs.com/loying/p/5212514.html
Copyright © 2011-2022 走看看