Core Graphics绘图技巧

绘图要点

  • 绘图需要在context上
  • 区分(UIKit 和Core Graphics方式)

绘图方式

绘图方式 说明
Core Graphic 在指定context上绘制,功能更全,更底层
UIKit 只能在当前context上绘制,简便好用

UIKit方式

  • 步骤

  • 创建图形相应的UIBezierPath对象

  • 设置一些修饰属性
  • 渲染
let path = UIBezierPath(ovalInRect: CGRectMake(0, 0, 100, 100))
UIColor.blueColor().setFill()
path.fill()

Core Graphics方式

  • 步骤类似于UIBezierPath
CGContextAddEllipseInRect(context, CGRectMake(0, 0, 100, 100))
CGContextSetFillColorWithColor(context, UIColor.redColor().CGColor)
CGContextFillPath(context)

Context 的使用

  • UIGraphicsBeginImageContextWithOptions会自动设置context为当前context
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0)
// code here...
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
  • Core Graphic方式绘制,用UIGraphicsGetCurrentContext获取当前context
  • 当前context与CG使用的context一致时,UIKit和CG两种方式可以混用
  • 如果当前绘制context,需要保留context状态,如坐标、旋转等等,绘制前使用context.saveGState()保存,绘制完使用context.restoreGstate()恢复,不涉及context修改,或者纯UIKit绘制则不需要

异步线程绘制

创建绘图上下文,准备绘图资源,生成图片,都是占用CPU时间的,最后一步提交GPU渲染也会卡当前线程。UIKit是非线程安全的,因此设计到UIKit的绘图不能异步绘制,但是绘图和数据准备等是可以异步线程的,对于一般的绘制,GPU是足够的,加速UIView的显示,以及手势的响应,并提高FPS,关键在于缩短主线程耗时。为此有以下建议:

  1. 绘图数据的准备尽量可以放到后台线程,包括读缓存,解析,运算等。
  2. 对于变化不是很多的,可以使用UIImage的形式显示,在后台线程渲染成图片
    • 通过ScrollView、UIAnimation、UITransform来实现缩放、移动、动画和变形等
    • 交互处理完成后,建议按照变换参数修改数据重新绘制以保持清晰度
    • 通过修改数据并重新绘制和显示来处理选择、高亮等
  3. 对于变化复杂的动画形式,则只能按帧绘制,尽量降低绘制代码的复杂度,采用UIImage+绘图结合的方式节省资源

results matching ""

    No results matching ""