2010-09-26 69 views
1

我有一個基於UIView的控件,需要根據控件的各種標準和屬性調整大小。我不確定我做這件事的方式是否是最好的方式,但迄今爲止,這是我發現似乎可行的唯一方法。因爲控件的大小取決於各種屬性,所以我無法在構造函數中設置大小。iPhone:在drawRect中調整大小:

我有一個名爲setupControl的方法:它包含所有代碼來完成基於屬性集的設置。我不想setupControl:手動調用,所以在我的drawRect檢測是否我需要調用它,然後排隊這樣的選擇:

[self performSelector:@selector(setupControl)withObject:self afterDelay:0]; 
return; 

在setupControl的底部:當時我做的事:

[self setNeedsDisplay]; 
self.hidden = NO; 

我也重寫了initWithFrame:和initWithDecoder:構造函數,以便它們將UIView設置爲隱藏,直到執行設置代碼。隨着控件調整大小,消除顯示屏上的任何「閃爍」的想法。

正如我所說的,這工作正常,可以繪製控件的大小是xib文件,然後在運行時將自己設置爲正確的大小。

我的問題是這種排隊選擇器的方法,退出drawRect:然後使用setNeedsDisplay是唯一的方法來做到這一點? O有沒有發現我可以重寫的一些方法?或者是其他東西?

+0

您是否考慮過不使用IB並在代碼中做所有事情? – 2010-09-26 14:39:15

+0

我只使用IB來佈置使用此控件的視圖。控制本身是基於代碼的。此外,該控件可作爲其他程序使用的框架的一部分,因此我不能認爲它是基於代碼或IB的。我唯一想到的其他選擇是刪除調整大小的代碼,並期望開發人員能夠正確調整控件的大小。使它更簡單:-) – drekka 2010-09-26 16:13:42

回答

3

您可能想要重寫的內容是layoutSubviews而不是您正在更改佈局的drawRect,而不是實現自定義繪圖。

對於任何更改視圖大小的屬性,您可能還必須使用自定義設置器,並在設置器中調用[self setNeedsLayout]以確保在計算視圖大小之前調用layoutSubviews方法。

+0

嗯,該控件沒有任何子視圖(我正在繪製drawRect中的一些繪圖:並想根據該繪圖調整控件的大小)。所以我不確定這是否是正確的方法。 – drekka 2010-09-27 00:10:14

+0

但是我剛剛閱讀了sizeToFit:和sizeThatFits:doco。但不清楚它們如何適應事物的情況。我真的很希望看到一個文檔概述了實例化控件時調用的控件,以便了解啓動週期。 – drekka 2010-09-27 00:11:38

+0

基本上,你應該忽略你沒有任何子視圖,並假裝像你一樣。覆蓋sizeThatFits:並返回您希望視圖的大小。在layoutSubviews中,計算視圖中所有「元素」的大小和位置(並將結果存儲在一些ivars中),然後在drawRect:中執行繪圖。請注意,您希望儘可能少地在drawRect中進行計算。保持快速。請在layoutSubviews中進行計算。 – 2010-09-27 03:16:58