1. 代码创建
private lazy var testView = TestView()
- 使用init方法,底层会执行
init(frame: CGRect) {}
方法,frame为默认值zero,如果直接调用init(frame: CGRect) {}
方法也是可以的 willMove(toSuperview newSuperview: UIView?) {}
: 即将加入到父视图或则从父视图移出, 如果是加入,则参数newSuperview
的值为当前父视图
, 如果是移出,则参数的值为nil
didMoveToSuperview() {}
:完全加入父视图,或则从父视图中完全移出,会调用此方法willMove(toWindow newWindow: UIWindow?) {}
: 即将加入到当前窗口,参数newWindow
表示当窗口对象;或则表示即将从当前窗口移出,参数为nil
didMoveToWindow() {}
: 完全添加到当前窗口中, 或则完全的从当前窗口中移出layoutSubviews() {}
: 对所有子视图进行布局时调用deinit{}
: 表示当前对象销毁时调用(当前视图从父视图中移出,并设置为nil)
2. XIB创建View
testXIBView = (Bundle.main.loadNibNamed("TestXIBView", owner: nil, options: nil)?.first as! TestXIBView)
- 通过XIB创建的View会首先调用
required init?(coder: NSCoder) {}
方法 进行反序列化 func awakeFromNib() {}
: 通过xib反序列化后唤醒,初始化,此时空间是存在的- 然后上代码创建View一样依次调用:
willMoveToSuperview
、didMoveToSuperview
、willMoveToWindow
、didMoveToWindow
、layoutSubviews
等方法 - 调用
func draw(_ rect: CGRect){}
:通过XIB文件创建的view在结束布局之后进行绘制 - deinit{}: 表示当前对象销毁时调用(当前视图从父视图中移出,并设置为nil)
3. 总结
- 无论是代码还是xib创建的view,在添加到容器或则从容器中移出,都会调用
willMoveToSuperview
、didMoveToSuperview
、willMoveToWindow
、didMoveToWindow
这个四个方法 - 纯代码创建view,只要调用
init
方法,就一定会调用initWithFrame
方法。 - 使用xib创建view时,会调用
required init?(coder: NSCoder) {}
、awakeFromNib
这两个放进行反序列化和唤醒