一.通过协议方法款速加载xib中的view
1.首先创建对应的xib和view文件
2.创建协议文件,NibLoad.swift
协议代码如下
/*
xib自定义的view遵循这个协议,可以实现快速加载
*/
protocol Nibloadable {
}
extension Nibloadable where Self : UIView{
static func loadNib(_ nibNmae :String? = nil) -> Self{
return Bundle.main.loadNibNamed(nibNmae ?? "\(self)", owner: nil, options: nil)?.first as! Self
}
}
让TestView2遵循Nibloadable协议后就能直接使用了。这样避免了每次自定义view的时候都要自定义加载方法。
testView2 = TestView2.loadNib()
self.view.addSubview(testView2)
testView2.frame = CGRect.init(x: 130, y: 20, width: 100, height: 100)
二. 纯代码和Xib自定义view时如何获取view的真实frame
如果是纯代码添加约束的话,添加完后,执行setNeedsLayout和layoutIfNeeded,之后,就能获得子控件的真实frame了,
setNeedsLayout:标记一个view为需要更新约束。
layoutIfNeeded:如果有被标记的veiw,执行layoutSubviews,
init?(coder aDecoder: NSCoder):xib初始化控件时调用,在该方法中控件为nil,可以在这个方法里代码添加控件
awakeFromNib() :xib子控件初始化完成后调用,但是frame是xib中的frame,不是真实frame
layoutSubviews() :这个方法里获得的frame是真实的frame
从上面可以看出,如果是xib的话,从layoutSubviews可以获得子控件的真实frame,如果是纯代码的话,添加完约束后,调用setNeedsLayout和layoutIfNeeded后可以获得真实frame。
网友评论