我的代码非常简单,如下所示:
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()
}
}
但是,它不会在View
中显示整个图像,而只显示一部分。
我也设置了CALayerContentsGravity.resizeAspectFill
和UIScreen.main.scale
,但没有生效。
这是一个相对容易的解决方法:
layer.position = svgView.center
并且还将图层添加到UIView
中,如下所示:
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()
}
}