有没有比UIGraphicsImageRenderer更快的方式将路径渲染到UIImage上?

时间:2018-03-01 13:36:10

标签: ios image render

我想在iOS应用程序中显示地图。为此,我得到了一个平面图(UIImage)并使用以下代码将路径(代表建筑物或房间)渲染到地图图像上:

static func draw(paths: [[CGPoint]], toImage image: UIImage?) -> UIImage? {
    if let image = image {
        let renderer = UIGraphicsImageRenderer(size: image.size)
        return renderer.image { context in
            image.draw(at: CGPoint(x: 0, y: 0))
            context.cgContext.setFillColor(UIColor.init(white: 0.1, alpha: 0.5).cgColor)
            for path in paths {
                if path.count > 2 {
                    context.cgContext.move(to: path[0])
                    for point in path {
                        context.cgContext.addLine(to: point)
                    }
                    context.cgContext.addLine(to: path[0])
                }
            }
            context.cgContext.drawPath(using: .fill)
        }
    } else {
        return nil
    }
}

然后将此方法的结果设置为UIImageView。但是,这需要大约两秒钟,所以太长了。

我是iOS开发的新手,这是我找到的唯一方法。

有谁知道更快的方式?也许使用自定义视图或什么?

1 个答案:

答案 0 :(得分:0)

我建议看看CAShapeLayer,它通常很快,但我不能说它在你的情况下是否优于UIGraphicsImageRenderer。我的猜测是它会,因为它也会根据需要进行缩放,因此无需创建大图像。

如果您不熟悉图层,它们就像是视图,但它们没有用户输入部分。它们易于使用,因为每个UIView实际上都有.layer的渲染,也可以用作图层父级。

要使图层与视图一起使用,只需将其作为子图层添加到视图图层属性中,然后确保它具有正确的大小。通过使用图层.contentsGravity或在视图layoutSubviews中手动设置图层来确定图层大小的最佳方法。

Read more about CAShapeLayer in the docs

A tutorial on layers