0

SVG 画像ファイルを解析し、そのパスを CAShapeLayer に変換します。その後、この CAShapeLayer を UIImage ビューのレイヤーに追加します。問題なく動作しますが、問題は UIImage ビューに適合しないことです。それが出力です。 画像 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
}

これらの2行のコードを検索して追加したところ、この結果が得られました

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)
        }

それがアウトプットです。 画像2

uiImageビューの境界に従って値を計算する方法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
        }
    }
4

2 に答える 2