如何在SwiftUI中显示整个CALayer内容? [英] How could I display the entire CALayer content in the SwiftUI?

查看:297
本文介绍了如何在SwiftUI中显示整个CALayer内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码非常简单,如下所示:

My code is very simple as follow:

import PocketSVG
import SwiftUI

struct SVGImage: UIViewRepresentable {
    var SVGName: String?
    var tintStrokeColor: CGColor?
    var tintFillColor: CGColor?

    func makeUIView(context: Context) -> UIView {
        return UIView()
    }

    func updateUIView(_ view: UIView, context: Context) {
        let svgURL = Bundle.main.url(forResource: "tiger", withExtension: "svg")!
        let paths = SVGBezierPath.pathsFromSVG(at: svgURL)
        let layer = CALayer()
        for path in paths {
            let shapeLayer = CAShapeLayer()
            shapeLayer.path = path.cgPath

            if let any = path.svgAttributes["stroke"] {
                shapeLayer.strokeColor = (any as! CGColor)
            }

            if let any = path.svgAttributes["fill"] {
                shapeLayer.fillColor = (any as! CGColor)
            }

            layer.addSublayer(shapeLayer)
        }

        layer.contentsGravity = CALayerContentsGravity.resizeAspectFill
        layer.contentsScale = UIScreen.main.scale
        view.layer.addSublayer(layer)
    }
}

struct SVGImage_Previews: PreviewProvider {
    static var previews: some View {
        SVGImage()
    }
}

但是它不会显示整个图像视图的年龄,并且只显示一部分。

But it doesn't display the entire image in the View, and it only display part.

我还设置了 CALayerContentsGravity .resizeAspectFill UIScreen.main.scale ,但不会生效。

I also set the CALayerContentsGravity.resizeAspectFill and UIScreen.main.scale, but it does not take effect.

推荐答案

这是一个相对简单的解决方法:

This is a relatively easy fix:

layer.position = svgView.center

并将该图层添加到 UIView 中,如下所示:

And also add the layer to a UIView like the following:

import PocketSVG
import SwiftUI

struct SVGImage: UIViewRepresentable {
    var SVGName: String?
    var tintStrokeColor: CGColor?
    var tintFillColor: CGColor?

    func makeUIView(context: Context) -> UIView {
        let svgView = UIView(frame: UIScreen.main.bounds)
        svgView.contentMode = .scaleAspectFit

        let svgURL = Bundle.main.url(forResource: "tiger", withExtension: "svg")!
        let paths = SVGBezierPath.pathsFromSVG(at: svgURL)
        let layer = CALayer()

        for path in paths {
            let shapeLayer = CAShapeLayer()
            shapeLayer.path = path.cgPath

            if let any = path.svgAttributes["stroke"] {
                shapeLayer.strokeColor = (any as! CGColor)
            }

            if let any = path.svgAttributes["fill"] {
                shapeLayer.fillColor = (any as! CGColor)
            }

            layer.addSublayer(shapeLayer)
        }

        layer.position = svgView.center
        svgView.layer.addSublayer(layer)

        return svgView
    }

    func updateUIView(_ view: UIView, context: Context) {

    }
}

struct SVGImage_Previews: PreviewProvider {
    static var previews: some View {
        SVGImage()
    }
}

这篇关于如何在SwiftUI中显示整个CALayer内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆