![](/img/trans.png)
[英]Resizing a UIView but drawing done by drawRect also changing size
[英]changing size of CALayer also changes size of previously added layer's size
我正在嘗試使用此自定義 class 繪制 UIImageView 並且我希望能夠更改用戶繪制的線條的大小和顏色。 但是每次我更改 CALayer 的大小或顏色時,先前添加的圖層的顏色和大小也會隨之改變。
class DrawingImageView: UIImageView {
private lazy var path = UIBezierPath()
private lazy var previousTouchPoint = CGPoint.zero
var strokeColor: CGColor!
var strokeWidth: CGFloat!
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
let shapeLayer = CAShapeLayer()
shapeLayer.lineWidth = strokeWidth ?? 4
shapeLayer.strokeColor = strokeColor ?? UIColor.black.cgColor
shapeLayer.lineCap = .round
shapeLayer.lineJoin = .round
layer.addSublayer(shapeLayer)
if let location = touches.first?.location(in: self) { previousTouchPoint = location }
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
if let location = touches.first?.location(in: self) {
path.move(to: location)
path.addLine(to: previousTouchPoint)
previousTouchPoint = location
let layerA = layer.sublayers?.last as! CAShapeLayer
layerA.path = path.cgPath
}
}
}
這就是我將 class 分配給 tempImageView 的方式
let mainImageView = UIImageView()
var tempImgView: DrawingImageView?
mainImageView.frame = CGRect(x: 0, y: self.view.bounds.height / 7, width: imageWidth, height: imageHieght)
mainImageView.contentMode = .scaleAspectFit
mainImageView.layer.zPosition = 2
mainImageView.isOpaque = false
mainImageView.backgroundColor = .clear
mainImageView.isUserInteractionEnabled = true
mainImageView.tintColor = .clear
self.view.addSubview(mainImageView)
func DrawOverImage() {
mainImageView.isHidden = true
let drawnImageView = DrawingImageView(frame: mainImageView.frame)
drawnImageView.image = mainImageView.image
drawnImageView.contentMode = .scaleAspectFit
drawnImageView.isUserInteractionEnabled = true
drawnImageView.layer.zPosition = 3
self.tempImgView?.isUserInteractionEnabled = true
self.tempImgView = drawnImageView
self.view.addSubview(tempImgView!)
}
我還嘗試創建 CAShapeLayers 數組並將圖層添加到數組中,然后分配替換 subLayer,如 View.layer.subLayers[0] = layers[0] 但這也不起作用,我在網上找不到任何有用的資源。
任何幫助或建議將不勝感激,謝謝。
那是因為您每次都在繼續相同的路徑,因此最新的筆觸顏色和寬度將應用於整個路徑。
在不看其他邏輯的情況下,我相信您每次都應該在touchesBegan
中初始化一條新路徑,並且應該在touchesMoved
中使用這條新路徑
所以在touchesBegan
中,嘗試在layer.addSublayer(shapeLayer)
path = UIBezierPath()
) ,看看這是否給了你想要的東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.