我用 CAShapeLayer 創建了一個父視圖,并用 CAShapeLayer 創建了一個子按鈕。
class TestButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
let path = UIBezierPath()
path.move(to: CGPoint(x: 60, y: 100))
path.addLine(to: CGPoint(x: 0, y: 100))
path.addArc(withCenter: CGPoint(x: 100, y: 100), radius: 100, startAngle: .pi, endAngle: .pi*1.5, clockwise: true)
path.addLine(to: CGPoint(x: 100, y: 60))
path.addArc(withCenter: CGPoint(x: 100, y: 100), radius: 40, startAngle: .pi*1.5, endAngle: .pi, clockwise: false)
path.close()
let drawLayer = CAShapeLayer.init()
drawLayer.path = self.path.cgPath
drawLayer.fillColor = UIColor.green.cgColor
self.layer.addSublayer(drawLayer)
}
}
class TestView:UIView{
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 0, y: rect.height-20))
path.addLine(to: CGPoint(x: rect.width/2, y: rect.height))
path.addLine(to: CGPoint(x: rect.width, y: rect.height-20))
path.addLine(to: CGPoint(x: rect.width, y: 0))
path.addLine(to: CGPoint(x: 0, y: 0))
path.close()
let drawLayer = CAShapeLayer.init()
drawLayer.path = self.path.cgPath
drawLayer.fillColor = UIColor.red.cgColor
self.layer.addSublayer(drawLayer)
}
}
創建視圖
func createView() {
let announce = TestAnnotationview.init(frame: CGRect.init(x: 50, y: 400, width: 150, height: 150))
announce.backgroundColor = .blue
self.view.addSubview(announce)
let btn = TestButton2.init(frame: CGRect.init(x: 0, y: 0, width: 150, height: 150))
btn.backgroundColor = .yellow
announce.addSubview(btn)
}
它像這樣運行,父視圖的 CAShapeLayers 覆寫了它的子按鈕 CAShapeLayers。

但它像這樣顯示在除錯視圖層次結構中。

我如何像除錯視圖層次結構一樣對它們進行排序?謝謝解答!!
uj5u.com熱心網友回復:
不要在draw(_ rect:). 您無法控制呼叫該方法的頻率,并且每次都添加一個新的子層。
覆寫 drawRect 通常不是一個好主意,因為它會影響視圖其他部分的繪制和影片期間的性能。
例如,在您的 init 方法中創建并添加一次子層,如果需要,將其放置在layoutSubviews. 不要覆寫draw(_ rect:).
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415460.html
標籤:
上一篇:在SwiftUI中隱藏一個按鈕以在MacOS上使用其鍵盤快捷鍵
下一篇:函式列舉引數型別
