iOS Swift如何逐步绘制UIImage?

时间:2019-03-31 14:31:43

标签: uiimage swift4 drawing core-graphics ios12

如何使用iOS核心图形在单个图像中增量绘制大型数据集?

我有准备立即处理整个数据集(超过100,000个矩形)并生成单个图像的代码。这是一项耗时很长的操作,我希望将此数据集一次递增绘制1000个矩形,以显示这些小的图像更新(例如90年代从互联网下载的图像)

我的问题是:在整个操作过程中,我是否要保留对同一context的引用并向其中添加元素? -或-我应该使用UIGraphicsGetImageFromCurrentImageContext()捕获当前图像,然后在新的上下文中绘制它并在其顶部绘制其他矩形吗?

奖金问题-如果我想使用多个线程附加到同一图像,这是正确的方法吗?

   let context = UIGraphicsGetCurrentContext()!

    context.setStrokeColor(borderColor)
    context.setLineWidth(CGFloat(borderWidth))
    for elementIndex in 0 ..< data.count {

        context.setFillColor(color.cgColor)
        let marker = CGRect(x: toX(elementIndex),
                            y: toY(elementIndex),
                            width: rectWidth,
                            height: rectHeight)

        context.addRect(marker)
        context.drawPath(using: .fillStroke)
    }
    // Save the context as a new UIImage
    let myImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    if let cgImage = myImage?.cgImage,
        let orientation = myImage?.imageOrientation {

        return UIImage(cgImage: cgImage, scale: 2, orientation: orientation)
    }

1 个答案:

答案 0 :(得分:1)

您应该:

  • 将整个事件分配到一些后台队列中;
  • 定期调用SELECT news_title FROM news WHERE MATCH(news_title,news_text) AGAINST('أردوغان'); 并将图像视图更新分派到主队列中

例如,这将每¼秒更新一次图像视图:

UIGraphicsGetImageFromCurrentImageContext

位置:

DispatchQueue.global().async {
    var lastDrawn = CACurrentMediaTime()

    UIGraphicsBeginImageContextWithOptions(size, false, 0)

    for _ in 0 ..< 100_000 {
        // draw whatever you want

        let now = CACurrentMediaTime()
        if now - lastDrawn > 0.25 {
            self.updateImageView()
            lastDrawn = now
        }
    }

    self.updateImageView()

    UIGraphicsEndImageContext()
}

因此:

func updateImageView() {
    guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return }

    DispatchQueue.main.async {
        self.imageView.image = image
    }
}

收益:

enter image description here

现在,我不会直接致电CoreGraphics,但是您可以并且它会正常工作。