Вот повторная реализация класса TimerView
. Для UIView
, init
- не лучшее место для получения значений frame/bounds
, поскольку оно может измениться, когда autolayout
применяет ограничения во время выполнения. layoutSubviews
- лучшее место для получения правильных значений frame/bounds
для родительских / дочерних представлений и для настройки свойств дочернего пространства. Во-вторых, вы должны использовать родительское представление bounds
, чтобы настроить frame
.
ребенка.
class TimerView: UIView {
private var dotLayer: CAShapeLayer?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
dotLayer = CAShapeLayer()
dotLayer?.strokeColor = UIColor.blue.cgColor
self.layer.addSublayer(dotLayer!)
}
override func layoutSubviews() {
super.layoutSubviews()
drawDot()
}
func drawDot() {
let midViewX = self.bounds.midX
let midViewY = self.bounds.midY
let dotPath = UIBezierPath(ovalIn: CGRect(x: midViewX, y: midViewY, width: 5, height: 5))
dotLayer?.path = dotPath.cgPath
}
}