官术网_书友最值得收藏!

2.5 UIView的狀態監視

UIView中,事先定義了監視UIView狀態變化的方法。當創建UIView的子類時,重寫這些狀態監視方法,可以實現在狀態變化的時刻進行各種處理。表2-9中羅列出了UIView的狀態監視方法以及各自調用的時機。

表2-9 UIView狀態監視方法列表

重寫這些方法實現具體處理的實例代碼如下。

// 定義UILabel(UIView)的子類
@interface NewLabel :UILabel
@end
// 實現NewLabel 、重寫UIView的狀態監視方法
@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 方法將被依次調用,我們可以通過日志具體查看調用過程,日志內容如下。

……
willMoveToSuperview
willMoveToWindow
didMoveToWindow
didMoveToSuperview
……

知識專欄(Column):frame與bounds的區別

我們改變UIView的位置及尺寸時會使用到frame屬性。但是,容易引起混淆的是,還有另外一個決定UIView尺寸的bounds屬性。實際上,當我們向bounds屬性中設置新的CGRect時,UIView的尺寸也會改變(位置沒變),與設置frame屬性的效果相同。bounds屬性到底是什么,該如何使用呢?這里首先將frame與bounds屬性各自的作用歸納如下。

  • frame屬性是以父元素(superview)的本地坐標系為基準的位置及尺寸。
  • bounds屬性是以自身的本地坐標系為基準的位置及尺寸。

圖2-18是上述歸納的示意圖,父元素追加到UIWindow中,子元素再追加到父元素中。

圖2-18 frame與bounds的關系

此時,父元素的frame.origin屬于UIWindow的本地坐標系,值為(100,15)。如此對應,子元素的frame.origin屬于父元素的坐標系,值為(0,80)。另外,bounds.origin都是以自身坐標系為基準的,因此值都為(0,0)。

frame屬性用于設置UIView位置及尺寸,而bounds屬性用于在自己的區域內繪制其他子元素,或者用于判斷用戶觸摸了自身坐標系的什么位置等。

我們可以看一個具體的例子(見圖2-19)。例如在坐標(50,15)處已有UIViewA。現在在UIViewA中追加與其相同大小的標簽子元素label。

圖2-19 追加與UIViewA相同大小的標簽

此處的問題是,標簽的frame屬性中正確的設置值為哪一個。

  • label.frame = UIViewA.frame。
  • label.frame = UIViewA.bounds。

初看起來正確的答案好像是1,但其實正確的答案為2。frame屬性屬于父元素的本地坐標系范疇。label.frame中設置的值,從UIViewA的本地坐標系來考慮,應該是(0,0,100,80)。但是 UIViewA.frame的值為(50,15,100,80)。因此向label.frame中設置的正確值是,同樣以UIViewA本地坐標系為基準的 UIViewA.bounds,即(0,0,100,80)。

主站蜘蛛池模板: 保德县| 盐池县| 新丰县| 昌吉市| 阿荣旗| 宜兰县| 泽普县| 堆龙德庆县| 深圳市| 清水河县| 尼木县| 嵊泗县| 泾阳县| 邵武市| 昌黎县| 恩平市| 凤翔县| 浦东新区| 马关县| 闵行区| 襄垣县| 茶陵县| 化德县| 邹城市| 丹凤县| 肃宁县| 石台县| 天峻县| 深州市| 桦甸市| 四子王旗| 左贡县| 布尔津县| 阜平县| 新巴尔虎左旗| 青岛市| 余干县| 济宁市| 彰武县| 沙河市| 遂宁市|