【发布时间】:2021-10-18 10:03:47
【问题描述】:
我正在解析 SVG 图像文件并将其路径转换为 CAShapeLayer,之后我将此 CAShapeLayer 添加到 UIImage View 的图层。 它工作正常,但问题是它不适合 UIImage 视图。 那是输出。 Image 1。 这是向 UIImageView 添加图层的代码
if let svgURL = Bundle.main.url(forResource: "image", withExtension: "svg") {
let paths = SVGBezierPath.pathsFromSVG(at: svgURL)
for path in paths {
items.append(path)
let layer = createLayer(path: path)
layer.frame = self.backgroundIV.bounds
self.backgroundIV.layer.addSublayer(layer)
}
} // Create Layer from Paths Method
fileprivate func createLayer(path: SVGBezierPath) -> CAShapeLayer {
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)
}
return shapeLayer
}
我搜索并添加了这两行代码,我得到了这个结果
let scale = CGFloat(0.5)
for path in paths {
path.apply(CGAffineTransform(scaleX: scale, y: scale))
items.append(path)
let layer = createLayer(path: path)
layer.frame = self.backgroundIV.bounds
self.backgroundIV.layer.addSublayer(layer)
}
这是输出。 Image 2
我不知道如何根据uiImage View bounds计算scaleX或scaleY(在CGAffineTransform方法中使用)值
编辑 注意:我对 CAShapeLayer 应用了触摸支持, 那是代码。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
guard let point = touches.first?.location(in: self.backgroundIV),
let layers = self.backgroundIV.layer.sublayers
else { return }
var hitLayers: [CAShapeLayer] = []
selectedLayer?.lineWidth = CGFloat(0)
for subLayer in layers {
if let thisLayer = subLayer as? CAShapeLayer,
let pth = thisLayer.path {
let layerPoint: CGPoint = thisLayer.convert(point, from: self.backgroundIV.layer)
if pth.contains(layerPoint) {
// undoModel.append()
hitLayers.append(thisLayer)
}
}
}
selectedLayer = hitLayers.last
selectedLayer?.strokeColor = UIColor.red.cgColor
selectedLayer?.lineWidth = CGFloat(3)
undo.append(.init(stokeColor: nil, selectedLayer: selectedLayer, points: []))
if ((selectedLayer?.frame.contains(point)) != nil) {
isDragged = true
}
}
【问题讨论】:
-
我想知道是否不是因为您正在检查的尺寸:
self.backgroundIV.bounds不是最后一个。或者它是?你能打印出来检查一下吗?如果不是最后一个,请检查 layoutSubviews,并在此处更新图层框架/比例。 -
我相信您使用的是 PocketSVG,那么最好使用提供的 SVGImageView。
-
@ChanOnly123 在我的情况下它不起作用。
-
@AliAkbar - 假设您使用的是
PocketSVG(基于您之前的问题),您是否有理由不使用它的SVGImageView?
标签: swift core-animation cashapelayer swiftsvg pocketsvg