我有一个带有IBAction
的完成按钮,如下所示:
@IBAction func done() {
print("Done pressed");
let hudView = HudView.hud(inView: (navigationController?.view)!, animated: true)
print("Set text");
hudView.text = "Toggled"
}
HudView
是UIView
的子类,具有便捷的构造函数
class func hud(inView view: UIView, animated: Bool) -> HudView
{
print("Constructor is called")
let hudView = HudView(frame: view.bounds)
hudView.isOpaque = false
view.addSubview(hudView)
view.isUserInteractionEnabled = false
return hudView
}
我也覆盖了其中的draw方法。
override func draw(_ rect: CGRect) {
print("Draw is called")
...
}
问题是我不明白为什么它会按这样的顺序打印出来
Done pressed
Constructor is called
Set text
Draw is called
为什么在设置文本之前不调用draw方法?为什么不立即构建它呢?
答案 0 :(得分:1)
根据苹果公司的官方Documentation。
第一次显示视图或事件时调用此方法 发生使视图的可见部分无效的情况。你不应该 自己直接调用此方法。要使部分视图无效, 从而导致该部分被重绘,请调用setNeedsDisplay() 或使用setNeedsDisplay(_ :)方法。
初始化视图时,不会将其添加到视图层次结构中,也不需要显示该视图。因此不调用draw(_ :)。将视图作为子视图添加到视图层次结构时,必须显示该视图并调用该方法。
触发setNeedsDisplay()
和setNeedsDisplay(_:)
之外的其他事情会触发此方法,是在您为视图进行布局或更改视图大小时。