UIKit何时调用“ draw”?

时间:2018-07-18 20:45:49

标签: ios swift uiviewcontroller

我有一个带有IBAction的完成按钮,如下所示:

@IBAction func done() {
    print("Done pressed");
    let hudView = HudView.hud(inView: (navigationController?.view)!, animated: true)
    print("Set text");
    hudView.text = "Toggled"
}

HudViewUIView的子类,具有便捷的构造函数

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方法?为什么不立即构建它呢?

1 个答案:

答案 0 :(得分:1)

根据苹果公司的官方Documentation

  

第一次显示视图或事件时调用此方法   发生使视图的可见部分无效的情况。你不应该   自己直接调用此方法。要使部分视图无效,   从而导致该部分被重绘,请调用setNeedsDisplay()   或使用setNeedsDisplay(_ :)方法。

初始化视图时,不会将其添加到视图层次结构中,也不需要显示该视图。因此不调用draw(_ :)。将视图作为子视图添加到视图层次结构时,必须显示该视图并调用该方法。

触发setNeedsDisplay()setNeedsDisplay(_:)之外的其他事情会触发此方法,是在您为视图进行布局或更改视图大小时。