- iPhone UIKit詳解
- 王志剛 王中元 朱蕾編著
- 912字
- 2019-01-01 07:04:25
2.5 UIView的狀態(tài)監(jiān)視
UIView中,事先定義了監(jiān)視UIView狀態(tài)變化的方法。當(dāng)創(chuàng)建UIView的子類時(shí),重寫(xiě)這些狀態(tài)監(jiān)視方法,可以實(shí)現(xiàn)在狀態(tài)變化的時(shí)刻進(jìn)行各種處理。表2-9中羅列出了UIView的狀態(tài)監(jiān)視方法以及各自調(diào)用的時(shí)機(jī)。
表2-9 UIView狀態(tài)監(jiān)視方法列表
重寫(xiě)這些方法實(shí)現(xiàn)具體處理的實(shí)例代碼如下。
// 定義UILabel(UIView)的子類 @interface NewLabel :UILabel @end // 實(shí)現(xiàn)NewLabel 、重寫(xiě)UIView的狀態(tài)監(jiān)視方法 @implementation NewLabel -(void)didAddSubview:(UIView*)subview { NSLog(@"didAddSubview"); } -(void)didMoveToSuperview { NSLog(@"didMoveToSuperview"); } -(void)didMoveToWindow { NSLog(@"didMoveToWindow"); } -(void)willMoveToSuperview:(UIView*)newSuperview { NSLog(@"willMoveToSuperview"); } -(void)willMoveToWindow:(UIWindow*)newWindow { NSLog(@"willMoveToWindow"); } -(void)willRemoveSubview:(UIView*)subview { NSLog(@"willRemoveSubview"); } @end
例如,將此NewLabel作為子元素追加到具體的UIView后,willMoveToSuperview:方法以及didMoveToSuperview 方法將被依次調(diào)用,我們可以通過(guò)日志具體查看調(diào)用過(guò)程,日志內(nèi)容如下。
…… willMoveToSuperview willMoveToWindow didMoveToWindow didMoveToSuperview ……
知識(shí)專欄(Column):frame與bounds的區(qū)別
我們改變UIView的位置及尺寸時(shí)會(huì)使用到frame屬性。但是,容易引起混淆的是,還有另外一個(gè)決定UIView尺寸的bounds屬性。實(shí)際上,當(dāng)我們向bounds屬性中設(shè)置新的CGRect時(shí),UIView的尺寸也會(huì)改變(位置沒(méi)變),與設(shè)置frame屬性的效果相同。bounds屬性到底是什么,該如何使用呢?這里首先將frame與bounds屬性各自的作用歸納如下。
- frame屬性是以父元素(superview)的本地坐標(biāo)系為基準(zhǔn)的位置及尺寸。
- bounds屬性是以自身的本地坐標(biāo)系為基準(zhǔn)的位置及尺寸。
圖2-18是上述歸納的示意圖,父元素追加到UIWindow中,子元素再追加到父元素中。

圖2-18 frame與bounds的關(guān)系
此時(shí),父元素的frame.origin屬于UIWindow的本地坐標(biāo)系,值為(100,15)。如此對(duì)應(yīng),子元素的frame.origin屬于父元素的坐標(biāo)系,值為(0,80)。另外,bounds.origin都是以自身坐標(biāo)系為基準(zhǔn)的,因此值都為(0,0)。
frame屬性用于設(shè)置UIView位置及尺寸,而bounds屬性用于在自己的區(qū)域內(nèi)繪制其他子元素,或者用于判斷用戶觸摸了自身坐標(biāo)系的什么位置等。
我們可以看一個(gè)具體的例子(見(jiàn)圖2-19)。例如在坐標(biāo)(50,15)處已有UIViewA。現(xiàn)在在UIViewA中追加與其相同大小的標(biāo)簽子元素label。

圖2-19 追加與UIViewA相同大小的標(biāo)簽
此處的問(wèn)題是,標(biāo)簽的frame屬性中正確的設(shè)置值為哪一個(gè)。
- label.frame = UIViewA.frame。
- label.frame = UIViewA.bounds。
初看起來(lái)正確的答案好像是1,但其實(shí)正確的答案為2。frame屬性屬于父元素的本地坐標(biāo)系范疇。label.frame中設(shè)置的值,從UIViewA的本地坐標(biāo)系來(lái)考慮,應(yīng)該是(0,0,100,80)。但是 UIViewA.frame的值為(50,15,100,80)。因此向label.frame中設(shè)置的正確值是,同樣以UIViewA本地坐標(biāo)系為基準(zhǔn)的 UIViewA.bounds,即(0,0,100,80)。
- 數(shù)據(jù)通信與計(jì)算機(jī)網(wǎng)絡(luò)(第2版)
- 用萬(wàn)用表檢修液晶電視機(jī)一學(xué)就會(huì)
- 電子工程師自學(xué)速成:入門篇(第2版)
- 輕松電子制作
- 加權(quán)分?jǐn)?shù)傅里葉變換及其在通信系統(tǒng)中的應(yīng)用
- 5G在智能電網(wǎng)中的應(yīng)用
- 5G網(wǎng)絡(luò)技術(shù)與規(guī)劃設(shè)計(jì)基礎(chǔ)
- 光傳輸網(wǎng)絡(luò)技術(shù):SDH與DWDM(第2版)
- iOS 7開(kāi)發(fā)快速入門
- 通信員指導(dǎo)手冊(cè)
- GPRS網(wǎng)絡(luò)信令實(shí)例詳解
- 新型開(kāi)關(guān)電源典型電路設(shè)計(jì)與應(yīng)用(第2版)
- LED照明設(shè)計(jì)與應(yīng)用
- 電子技術(shù)基礎(chǔ)實(shí)驗(yàn)與課程設(shè)計(jì)
- 數(shù)字信號(hào)處理