• 1 、Quartz 2D绘图基础


    Quartz 2D绘图

    Quartz 2D绘图的核心API是CGContextRef,该API专门用于绘制各种图形。

    关注微信公众号:ioscoding ,分享优质iOS编程技术。by:shuju

    1.1  Quartz 2D绘图基础:CGContextRef

    使用Quartz 2D绘图的关键步骤有两步:获取CGContextRef;调用CGContextRef的方法进行绘图。

    不同场景下获取CGContextRef的方式各不相同,下面介绍iOS开发中最常见的场景下如何获取CGContextRef。

    1. 自定义UIView时获取CGContextRef

    开发自定义UIView的方法是,开发一个继承UIView的子类,并重写该UIView的drawRect:方法,当该UIView每次显示出来时,或该UIView的内容需要更新时,系统都会自动调用该UIView的drawRect:方法。在调用drawRect:方法之前,系统会自动配置绘图环境,因此,程序只要通过如下函数即可获取CGContextRef绘图API:
     

    1. CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    获取CGContextRef之后,即可进行绘图。

    需要指出的是,重写UIView的drawRect:方法绘图时,它的绘图API的坐标原点位于该控件的左上角,横向为X轴,X坐标越大,位置越向右;纵向为Y轴,Y坐标越大,位置越向下。

    2. 创建位图时获取CGContextRef

    如果需要在创建位图时获取CGContextRef,那么程序需要先调用UIGraphicsBeginImageContext()函数来创建内存中的图片。然后才能调用UIGraphicsGetCurrentContext()获取绘图的CGContextRef。例如如下代码。

    1. // 创建内存中的图片  
    2. UIGraphicsBeginImageContext(CGSizeMake(320, 480));  
    3. // 获取向内存中图片执行绘图的CGContextRef  
    4. CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    Quartz 2D绘图的核心API是CGContextRef,该API并不是一个对象。由于Quartz 2D本身并不是面向对象的,它是面向过程的API,Quartz 2D提供了大量函数来完成绘图。

    Quartz 2D提供的绘图函数如表1.2所示。

    表1.2  Quartz 2D的绘图相关函数



    函数签名

    简要说明

    void CGContextClearRect(CGContextRef c, CGRect rect);

    擦除指定矩形区域上绘制的图形

    void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode);

    使用指定模式绘制当前CGContextRef中所包

    含的路径。第二个参数支持 kCGPathFill

    kCGPathEOFillkCGPathStrokekCGPathFillStrokekCGPathEOFillStroke等枚举值

    void CGContextEOFillPath(CGContextRef c);

    使用奇偶规则来填充该路径包围的区域。奇

    偶规则指:如果某个点被路径包围了奇数次,

    系统绘制该点;如果被路径包围了偶数次,系统不绘制该点

    void CGContextFillPath(CGContextRef c);

    填充该路径包围的区域

    void CGContextFillRect(CGContextRef c,CGRect rect);

    填充rect代表的矩形

    void CGContextFillRects(CGContextRef c,const CGRect rects[], size_t count);

    填充多个矩形

    void CGContextFillEllipseInRect(CGContextRef context, CGRect rect);

    填充rect矩形的内切椭圆区域

    void CGContextStrokePath(CGContextRef c);

    使用当前 CGContextRef设置的线宽绘制路径

    void CGContextStrokeRect(CGContextRef c, CGRect rect);

    使用当前 CGContextRef设置的线宽绘制矩形框

    void CGContextStrokeRectWithWidth(CGContextRef c,

    CGRect rect, CGFloat width);

    使用指定线宽绘制矩形框

    void CGContextReplacePathWithStrokedPath(CGContextRef c);

    使用绘制当前路径时覆盖的区域作为当前CGContextRef

    中的新路径。举例来说,假如当前CGContextRef包含一

    个圆形路径且线宽为10,调用该方法后,当前CGContextRef

    将包含一个环宽为10的环形路径

    void CGContextStrokeEllipseInRect(CGContextRef context,CGRect rect);

    使用当前 CGContextRef设置的线宽绘制rect矩形的内切椭圆

    void CGContextStrokeLineSegments(CGContextRef c,

    const CGPoint points[], size_t count);

    使用当前 CGContextRef设置的线宽绘制多条线段。该

    方法需要传入2NCGPoint组成的数组,其中12个点

    组成第一条线段,34个点组成第2条线段,以此类推































    表12.2中的大部分方法都涉及使用路径,路径由另一个API:CGPathRef来代表。CGPathRef代表任意多条直线或曲线连接而成的任意图形,当CGContextRef根据CGPathRef绘制时,它可以绘制出任意的形状。

    关于如何利用CGContextRef来构建路径和添加路径,本节后面会有详细介绍,此处先用最简单的方法来绘制直线、矩形、椭圆等几何形状。

    在绘图之前,还需要对绘图的颜色、线条粗细等属性进行设置,Quartz 2D提供了如表12.3所示的函数来设置绘图信息。

    表12.3  设置绘图属性的相关函数
     

    方法签名

    简要说明

    void CGContextSaveGState(CGContextRef c);

    保存CGContextRef当前的绘图状态,方便以后恢复该状态

    void CGContextRestoreGState(CGContextRef c);

    CGContextRef的状态恢复到最近一次保存时的状态

    CGInterpolationQuality CGContextGetInterpolation

    Quality(CGContextRef c);

    获取当前CGContextRef在放大图片时的插值质量

    void CGContextSetInterpolationQuality(CGContextRef c,

    CGInterpolationQuality quality);

    设置当前CGContextRef在放大图片时的插值质量

    void CGContextSetLineCap(CGContextRef c, CGLineCap cap);

    设置线段端点的绘制形状。该属性支持如下三个值。

    kCGLineCapButt:该属性值指定不绘制端点,

    线条结尾处直接结束。这是默认值。

    kCGLineCapRound:该属性值指定绘制圆形端点,

    线条结尾处绘制一个直径为线条宽度的半圆。

    kCGLineCapSquare:该属性值指定绘制方形端点。

    线条结尾处绘制半个边长为线条宽度的正方形。需要

    说明的是,这种形状的端点与“butt”形状的端点十分相似,

    只是采用这种形式的端点的线条略长一点而已

    void CGContextSetLineDash(CGContextRef c,

    CGFloat phase, const CGFloat lengths[],size_t count);

    设置绘制边框时所用的点线模式,Quartz 2D

    持非常强大的点线模式。后面会有详细介绍

    void CGContextSetLineJoin(CGContextRef c, CGLineJoin join);

    设置线条连接点的风格,该属性支持如下三个值:

    kCGLineJoinMeter:这是默认的属性值。

    该方格的连接点形状如所示。

    kCGLineJoinRound:该方格的连接点形状如 所示。

    kCGLineJoinBevel:该方格的连接点形状如 所示

    void CGContextSetLineWidth(CGContextRef c, CGFloat width);

    设置绘制直线、边框时的线条宽度

    void CGContextSetMiterLimit(CGContextRef c, CGFloat limit);

    当把连接点风格设为meter风格时,该方法用于控制锐角箭头的长度

    void CGContextSetPatternPhase(CGContextRef c, CGSize phase);

    设置该CGContextRef采用位图填充的相位

    void CGContextSetFillPattern(CGContextRef c,

    CGPatternRef pattern,const CGFloat components[]);

    设置该CGContextRef使用位图填充

    void CGContextSetShouldAntialias(CGContextRef c, bool shouldAntialias);

    设置该CGContextRef是否应该抗锯齿(即光滑图形曲线边缘)

    void CGContextSetStrokePattern(CGContextRef c, 

    CGPatternRef pattern, const CGFloat components[]);

    设置该CGContextRef使用位图绘制线条、边框

    续表
     

    方法签名

    简要说明

    void CGContextSetBlendMode(CGContextRef context,CGBlendMode mode);

    设置CGContextRef的叠加模式。Quartz 2D

    支持多种叠加模式,后面专门有关于叠加模式的介绍

    void CGContextSetAllowsAntialiasing(CGContextRef context, bool allowsAntialiasing);

    设置该CGContextRef是否允许抗锯齿

    void CGContextSetAllowsFontSmoothing(CGContextRef context, bool allowsFontSmoothing);

    设置该CGContextRef是否允许光滑字体

    void CGContextSetShouldSmoothFonts(CGContextRef c,bool shouldSmoothFonts);

    设置该CGContextRef是否允许光滑字体

    void CGContextSetAlpha (CGContextRef c, CGFloat alpha);

    设置全局透明度

    void CGContextSetCMYKFillColor(CGContextRef c,

    CGFloat cyan, CGFloat magenta, CGFloat yellow,CGFloat black, CGFloat alpha);

    使用CMYK颜色模式来设置该CGContextRef的填充颜色

    void CGContextSetCMYKStrokeColor(CGContextRef c,

     CGFloat cyan, CGFloat magenta, CGFloat yellow,CGFloat black, CGFloat alpha);

    使用CMYK颜色模式来设置该CGContextRef的线条颜色

    void CGContextSetFillColorWithColor(CGContextRef c, CGColorRef color);

    使用指定颜色来设置该CGContextRef的填充颜色

    void CGContextSetStrokeColorWithColor(CGContextRef c, CGColorRef color);

    使用指定颜色来设置该CGContextRef的线条颜色

    void CGContextSetGrayFillColor(CGContextRef c, CGFloat gray, CGFloat alpha);

    使用灰色来设置该CGContextRef的填充颜色

    void CGContextSetGrayStrokeColor(CGContextRef c, CGFloat gray, CGFloat alpha);

    使用灰色来设置该CGContextRef的线条颜色

    void CGContextSetRGBFillColor(CGContextRef c, CGFloat gray, CGFloat alpha);

    使用RGB颜色模式来设置该CGContextRef的填充颜色

    void CGContextSetRGBStokeColor(CGContextRef c, CGFloat gray, CGFloat alpha);

    使用RGB颜色模式来设置该CGContextRef的线条颜色

    void CGContextSetShadow(CGContextRef context,

    CGSize offset, CGFloat blur);

    设置阴影在XY方向上的偏移,以及模糊度(blur

    值越大,阴影越模糊)。该函数没有设置阴影颜色,

    默认使用1/3透明的黑色(即RGBA{0, 0, 0, 1.0/3.0})作为阴影颜色

    void CGContextSetShadowWithColor(CGContextRef context, 

    CGSize offset, CGFloat blur, CGColorRef color);

    设置阴影在XY方向上的偏移,以及模糊度和阴影的颜色


  • 相关阅读:
    jqgrid content-type datatype
    github删除
    springcolud文章收藏
    springboot无法加载oracle驱动终极解决
    当多线程并发遇到Actor
    spring.boot 无法加载oracle驱动的可能原因
    MobileNet V2深入理解
    转载:从loss处理图像分割中类别极度不均衡的状况---keras
    6D姿态估计
    An overview of semantic image segmentation
  • 原文地址:https://www.cnblogs.com/shujucn/p/7481455.html
Copyright © 2020-2023  润新知