【问题标题】:Is there a faster way to render paths onto an UIImage than UIGraphicsImageRenderer?有没有比 UIGraphicsImageRenderer 更快的方法将路径渲染到 UIImage 上?
【发布时间】:2018-08-09 14:10:24
【问题描述】:

我想在我的 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 开发新手,这是我找到的唯一方法。

有人知道更快的方法吗?也许使用自定义视图之类的?

【问题讨论】:

  • 您可以做一些事情来简化和优化代码(例如使用addPath 而不是一次重新创建一条线段的路径)但我认为更有趣的问题是您需要渲染图像的路径,或者是否有其他解决方案。你在用渲染的图像做什么?只是在 UI 中显示?
  • 另外,您渲染路径的图像有多大?数组中大约有多少条路径,它们有多复杂(它们每条大约包含多少行)?
  • 是的,它只是显示在滚动视图中,因此可以移动和缩放。图片永远不会大于 1920x1080,并且路径不超过 10 条,每条最多 5 行

标签: ios image render


【解决方案1】:

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

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

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

Read more about CAShapeLayer in the docs

A tutorial on layers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2013-03-04
    • 2017-03-06
    相关资源
    最近更新 更多