我是 Swift 和 Core Animation 的新手。我想像這張圖片一樣在 CAShapeLayer 周圍創建矩形框,但我不知道。
詳細地說,我正在通過PocketSVG決議 SVG 影像并將其UIBezierPath轉換為CAShapeLayer,然后將這些層作為sublayer添加到UI Image View中。
這是我將Path轉換為CaShape Layer的代碼。
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
}
下面是代碼,我將圖層添加到 UIImage 視圖(backgroundIV)
for path in paths {
path.apply(.init(scaleX: scale, y: scale))
let layer = createLayer(path: path)
layer.frame = self.backgroundIV.bounds
self.backgroundIV.layer.addSublayer(layer)
}
我還將TapGesture、RotateGesture、ScaleGesture 和 PanGesture 添加到 CA Shape Layers,以下是代碼。
@objc func rotateLayer(_ sender: UIRotationGestureRecognizer) {
selectedLayer?.setAffineTransform(CGAffineTransform(rotationAngle: sender.rotation))
}
@objc func selectLayer(_ sender: UITapGestureRecognizer) {
let point = sender.location(in: self.backgroundIV)
guard 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) {
hitLayers.append(thisLayer)
}
}
}
selectedLayer = hitLayers.last
selectedLayer?.strokeColor = UIColor.red.cgColor
selectedLayer?.lineWidth = CGFloat(3)
selectedLayerRect = CGRect(origin: point, size: CGSize(width: 100, height: 100))
showPopupMenu()
}
@objc func moveLayer(_ recognizer: UIPanGestureRecognizer) {
let p = recognizer.location(in: self.backgroundIV)
selectedLayer?.position = p
}
@objc func scaleLayer(_ sender: UIPinchGestureRecognizer) {
selectedLayer?.transform = CATransform3DMakeScale(sender.scale, sender.scale, 1)
}
在SelectLayer方法的最后幾行中,我通過增加其筆觸寬度和顏色來突出顯示所選圖層。
selectedLayer?.strokeColor = UIColor.red.cgColor
selectedLayer?.lineWidth = CGFloat(3)
當我不選擇圖層時,我只是將它的lineWidth值設定為 0,這不是一個好習慣。
有沒有辦法像這張圖片一樣創建矩形框?
uj5u.com熱心網友回復:
試試這個..
我希望這對你有幫助......????
import UIKit
class ViewController : UIViewController {
let containerView: UIView = {
let view = UIView()
view.backgroundColor = .clear
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
containerView.frame = CGRect(x: view.frame.width/2 - 100, y: view.frame.height/2 - 100, width: 200, height: 200)
view.addSubview(containerView)
drawRectangle()
}
private func drawRectangle() {
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 200, y: 0))
path.addLine(to: CGPoint(x: 200, y: 200))
path.addLine(to: CGPoint(x: 0, y: 200))
path.addLine(to: CGPoint(x: 0, y: 0))
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.black.cgColor
shapeLayer.lineWidth = 3
containerView.layer.addSublayer(shapeLayer)
}
}
uj5u.com熱心網友回復:
如果您想在圖層的框架周圍繪制一個框,那很容易。只需設定aLayer.borderWidth=1和aLayer.borderColor=UIColor.someColor.cgColor。
系統將為您在圖層周圍添加邊框。
但是,如果您的圖層的框架大于它們包含的矩形的路徑,則可能會比您想要的大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347603.html
下一篇:如何洗掉工具列?
