前言:
1坠韩、在Mac OS中NSWindow的父類是NSResponder,而在iOS中UIWindow的父類是UIView炼列。程序一般只有一個窗口但是會又很多視圖只搁。
2、UIView的作用:描畫和動畫俭尖,視圖負(fù)責(zé)對其所屬的矩形區(qū)域描畫氢惋、布局和子視圖管理、事件處理、可以接收觸摸事件明肮、事件信息的載體等等菱农。
我在前面詳細(xì)介紹了setNeedsDisplay , setNeedsLayout和layoutIfNeeded 詳情請點擊柿估。
下面介紹的是view添加以及刪除時所觸發(fā)的方法
// 當(dāng)視圖添加子視圖時調(diào)用
- (void)didAddSubview:(UIView *)subview;
// 當(dāng)子視圖從本視圖移除時調(diào)用
- (void)willRemoveSubview:(UIView *)subview;
// 當(dāng)視圖即將加入父視圖時 / 當(dāng)視圖即將從父視圖移除時調(diào)用
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
// 當(dāng)試圖加入父視圖時 / 當(dāng)視圖從父視圖移除時調(diào)用
- (void)didMoveToSuperview;
// 當(dāng)視圖即將加入父視圖時 / 當(dāng)視圖即將從父視圖移除時調(diào)用
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
// 當(dāng)視圖加入父視圖時 / 當(dāng)視圖從父視圖移除時調(diào)用
- (void)didMoveToWindow;
上面是資料說的循未,究竟對不對呢?我們用swift版的代碼來驗證下秫舌。
先自定義一個<code>TestView</code>類
TestView代碼如下:
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 當(dāng)試圖加入父視圖時 / 當(dāng)視圖從父視圖移除時調(diào)用
override func didMoveToSuperview() {
print("\(#function)")
}
// 當(dāng)視圖即將加入父視圖時 / 當(dāng)視圖即將從父視圖移除時調(diào)用
override func willMove(toSuperview newSuperview: UIView?) {
print("\(#function)")
}
override func didAddSubview(_ subview: UIView) {
print("3秒后\(#function)")
}
override func willRemoveSubview(_ subview: UIView) {
print("6秒后\(#function)")
}
然后將該TestView創(chuàng)建實例的妖,添加到控制器的view,設(shè)背景色為紫色,并將001賦給tag值
override func viewDidLoad() {
super.viewDidLoad()
let testV = TestView()
testV.frame = self.view.bounds
testV.backgroundColor = UIColor.purple
testV.tag = 001
self.view.addSubview(testV)
上面方法觸發(fā)了
willMove(toSuperview:)
和didMoveToSuperview()
足陨,驗證了當(dāng)視圖即將加入父視圖時和當(dāng)試圖加入父視圖時調(diào)用
之后在viewDidLoad
添加一個帶有延遲的添加紅色view代碼嫂粟,值得一提的是,這是最新swift3.1的GCD延時方法
//如果不需要在主線程執(zhí)行,就去掉main
DispatchQueue.main.asyncAfter(deadline: .now()+3.0) {
let view = UIView.init(frame: CGRect(x: 10, y: 100, width: 100, height: 60))
view.backgroundColor = UIColor.red
testV.addSubview(view)
}
上面方法觸發(fā)了didAddSubview
墨缘,驗證了當(dāng)視圖添加子視圖時會調(diào)用
DispatchQueue.main.asyncAfter(deadline: .now()+6.0, execute: {
let tagView: TestView = self.view .viewWithTag(001) as! TestView
tagView.removeFromSuperview()
})
上面方法觸發(fā)了willRemoveSubview
星虹,驗證了當(dāng)子視圖從本視圖移除時會被調(diào)用,同時镊讼,willMove(toSuperview:)
和didMoveToSuperview()
也被調(diào)用了宽涌,分別驗證了當(dāng)視圖即將從父視圖移除時 和 當(dāng)視圖從父視圖移除時會被調(diào)用
經(jīng)證實,資料所述屬實蝶棋。
人家發(fā)現(xiàn)的即便是對卸亮,但終歸是人家的,只有自己驗證才是屬于自己的玩裙。