美文网首页iOS开发攻城狮的集散地
iOS-绘图框架CoreGraphics记录

iOS-绘图框架CoreGraphics记录

作者: Simple_Code | 来源:发表于2018-07-20 16:19 被阅读23次

    一、绘图系统简介

    iOS的绘图框架有多种,我们平常最常用的就是UIKit,其底层是依赖CoreGraphics实现的,而且绝大多数的图形界面也都是由UIKit完成,并且UIImage、NSString、UIBezierPath、UIColor等都知道如何绘制自己,也提供了一些方法来满足我们常用的绘图需求。除了UIKit,还有CoreGraphics、Core Animation,Core Image,OpenGL ES等多种框架,来满足不同的绘图要求。各个框架的大概介绍如下:

    • UIKit:最常用的视图框架,封装度最高,都是OC对象
    • CoreGraphics:主要绘图系统,常用于绘制自定义视图,纯C的API,使用Quartz2D做引擎
    • CoreAnimation:提供强大的2D和3D动画效果
    • CoreImage:给图片提供各种滤镜处理,比如高斯模糊、锐化等
    • OpenGL-ES:主要用于游戏绘制,但它是一套编程规范,具体由设备制造商实现

    二、绘图方式

    1.视图绘制

    调用UIView的drawRect:方法进行绘制。如果调用一个视图的setNeedsDisplay方法,那么该视图就被标记为重新绘制,并且会在下一次绘制周期中重新绘制,自动调用drawRect:方法。

    2.视图布局

    调用UIView的layoutSubviews方法。如果调用一个视图的setNeedsLayout方法,那么该视图就被标记为需要重新布局,UIKit会自动调用layoutSubviews方法及其子视图的layoutSubviews方法。

    在绘图时,我们应该尽量多使用布局,少使用绘制,是因为布局使用的是GPU,而绘制使用的是CPU。GPU对于图形处理有优势,而CPU要处理的事情较多,且不擅长处理图形,所以尽量使用GPU来处理图形。

    三、具体绘图方法

    1.图片上下文的绘制不需要在drawRect:方法中进行,在一个普通的OC方法中就可以绘制

    使用UIKit实现
    // 获取图片上下文
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);
    // 绘图
    UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)];
    [[UIColor blueColor] setFill];
    [p fill];
    // 从图片上下文中获取绘制的图片
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
    // 关闭图片上下文
    UIGraphicsEndImageContext();
    
    使用CoreGraphics实现
    // 获取图片上下文
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);
    // kai
    CGContextRef con = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100));
    CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
    CGContextFillPath(con);
    // 从图片上下文中获取绘制的图片
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
    // 关闭图片上下文
    UIGraphicsEndImageContext();
    

    2.drawRect:
    在UIView子类的drawRect:方法中实现图形重新绘制,绘图步骤如下:

    • 获取上下文
    • 绘制图形
    • 渲染图形
    使用UIKit实现
    - (void) drawRect: (CGRect) rect {
    UIBezierPath* p = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0,100,100)];
    [[UIColor blueColor] setFill];
    [p fill];
    }
    
    使用CoreGraphics实现
    - (void) drawRect: (CGRect) rect {
    CGContextRef con = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100));
    CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
    CGContextFillPath(con);
    }
    

    四、使用CoreGraphics裁圆角

    使用UIKit实现
    // UIBezierPath 裁剪
    + (UIImage *)UIBezierPathClip:(UIImage *)img cornerRadius:(CGFloat)c {
        int w = img.size.width * img.scale;
        int h = img.size.height * img.scale;
        CGRect rect = CGRectMake(0, 0, w, h);
        
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(w, h), false, 1.0);
        [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:c] addClip];
        [img drawInRect:rect];
        UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        return ret;
    }
    

    使用CoreGraphics实现

    + (instancetype)circleImage:(NSString *)name {
        return [[self imageNamed:name] circleImage];
    }
    - (instancetype)circleImage {
        // 开启图形上下文
        UIGraphicsBeginImageContext(self.size);
        // 上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        // 添加一个圆
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        CGContextAddEllipseInRect(ctx, rect);
        // 裁剪
        CGContextClip(ctx);
        // 绘制图片
        [self drawInRect:rect];
        // 获得图片
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return image;
    }
    

    相关文章

      网友评论

        本文标题:iOS-绘图框架CoreGraphics记录

        本文链接:https://www.haomeiwen.com/subject/eolqmftx.html