swift使用类方法加载xib视图和awakeFromNib方法调用顺序:
如下代码:
// MARK: - View LilfeCycle
class func initView() -> DSComposeTypeView {
// 从xib加载完成视图,就会调用awakeFromNib方法,此时frame是600 * 600
let v = Bundle.main.loadNibNamed("DSComposeTypeView", owner: nil, options: nil)?.first as! DSComposeTypeView
// XIB加载默认是 600*600
v.frame = kScreen.bounds
v.setupUI()
return v
}
override func awakeFromNib() {
// setupUI()
}
结果一番测试,我们可以总结如下:如果自定义view和xib的view关联(苹果本身不推荐这种做法),初始化的时候是使用类方法来进行初始化;而类方法初始化的时候需要加载xib文件,这里面就会出现调用顺序的问题。从xib加载完视图,系统就会立即调用awakeFromNib方法,而此时nib文件中view的frame实际上是600*600的,是不正确的,如果要更改其frame,需要注意调用顺序。改进写法如下:
// MARK: - View LilfeCycle
class func initView() -> DSComposeTypeView {
// 从xib加载完成视图,就会调用awakeFromNib方法,此时frame是600 * 600
return Bundle.main.loadNibNamed("DSComposeTypeView", owner: nil, options: nil)?.first as! DSComposeTypeView
}
override func awakeFromNib() {
// XIB加载默认是 600*600
frame = kScreen.bounds
setupUI()
}