2010-07-28 68 views
12

我有一個UIView的子類,需要根據它的寬度計算它的高度。當在代碼中創建一切正常。但是,當我嘗試在「界面」構建器中創建視圖時,儘管我重寫了所有相關的方法,但我無法獲取在界面構建器中設置的視圖的大小。從NIB大小問題加載UIView子類

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0 
    self = [super initWithCoder:aDecoder]; 
    NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0 
} 

- (void) awakeFromNib 
{ 
     NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well 
} 

- (void) setFrame:(CGRect)aFrame 
{ 
    [super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size. 
} 

所以我的下一個猜測是我的視圖的超級視圖可能是在awakeFromNib之後設置我的視圖的框架。事實證明它不是。我在我的視圖上覆蓋了setFrame,並在initWithCoder中調用它。

所以這是我所知道的,到目前爲止:

  1. 第一的initWithCoder叫
  2. 的initWithCoder月至SETFRAME一個電話:(的CGRect)AFRAME在框架的SETFRAME大小發送
  3. 正確的,我調用[超級SETFRAME:AFRAME]
  4. awakeFromNib稱爲
  5. super.frame.size.width =在awakeFromNib self.frame.size.width 0也0
  6. 當這個過程完成後,它看起來像是在它假設的下面幾個像素,但我想我的代碼得到如此緊湊的尺寸,它可能是我做的。

如果擴展initWithCoder,一定要調用父類方法的任何幫助將不勝感激

+0

的問題其實是完全錯誤的現在。我發佈了一個由於某種原因被刪除的答案。我的主要錯誤是使用%d在浮動時打印幀大小。這完全把我扔了。就我所見,我沒有做的事情,你的回答實際上並沒有做任何事情。 – 2014-04-01 16:47:36

回答

15

。正是在這個超級通話中,setFrame將在您的班級被調用。

然後您可以重新使用您的標準initWithFrame調用。

我始終做到以下幾點:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method. 
    return [self initWithFrame:[self frame]]; 
} 
+5

雖然這不是初始化控件兩次嗎? – Oren 2015-06-24 01:27:27