2011-11-02 70 views
2

我有抽獎RECT方法繪製圖像的自定義的UIView。我的問題是當我分配對象時,UIView想要我initWithFrame。視圖的框架需要與圖像大小和寬度相同。問題是,我沒有得到該圖像的大小和寬度,直到我創建的視圖的drawRect方法。在drawRect視圖中,將UIView的框架更改爲圖像尺寸似乎沒有效果。因此,我想要做的是這樣的:自定義用戶界面視圖更改幀大小

MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame: CGrectMake(0,0,0,0)]; 

然後MyCustomView的drawRect方法內我想以某種方式改變視圖的框架是我創建的圖像的幀大小。

我如何得到我想要的結果?不,在我啓動我的自定義視圖並將大小尺寸放入initWithFrame之前創建圖像不是一個選項。

這是我當前的代碼視圖的drawRect方法

UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",self.imgName]]; 
CGSize imgSize = [image size]; 
CGRect newrect = CGRectMake(self.frame.origin.x, self.frame.origin.y, imgSize.width, imgSize.height); 
self.frame = newrect; //This does nothing!! 
CGRect imgRect = CGRectMake(0, 0, imgSize.width, imgSize.height); 
[image drawInRect:imgRect]; 

回答

5

如果你看一下文檔的SETFRAME它說:

這種方法,在設定的框架矩形,重新定位並調整 它的父座標系內的接收器。它既不會 重新顯示接收器,也不會將其標記爲需要顯示。您必須使用display或setNeedsDisplay:來自己做 。

它不會重新顯示 - 通常在設置調用setNeedsDisplay的框架後。但是,這突出了你的雞和雞蛋問題。 setNeedsDisplay會導致drawrect被觸發。另外,正如Sulthan所指出的那樣,執行一些像在drawRect中加載圖像一樣重的東西並不是一個好主意。這是沉重的重量和drawRect之類的東西被重複調用大小等...

我會創建一個init模式(即使你說沒有選項),或創建一個屬性來設置圖像,並有圖像加載那時候。

+0

你說得對。通常我在將視圖插入到另一個視圖或使用動畫之前更改了框架,並且在這兩種情況下都會自動重新繪製視圖,所以我忘記了我必須調用setNeedsDisplay。 – Sulthan

3

改變從內部的drawRect框架是...不是一個很好的主意。 您認爲系統在繪製它時會如何調整大小?

而且從裝載裏面的drawRect圖像(慢速運行)(經常被調用)是不是一個很好的主意。 當您獲取文件名並在此時更改視圖框架時,您應該加載圖像。並可能使用一些動畫。如果沒有動畫,用戶不會期望視圖改變大小。

和:

沒有,創建映像前,我初始化我的自定義視圖,並把大小尺寸爲initWithFrame是不是一種選擇。

我無法想象任何情況,當這不是一個選項。這只是關於你如何構建你的代碼。

+0

從我所有的閱讀中,使用drawRect在UIView中創建圖像比使用UIImageViews更快,更輕 - 是不是這種情況?如果是的話,我可以在哪裏閱讀?或者你有其他建議嗎?我可能在任何時候在屏幕上顯示超過50張圖片。另外我的圖像很可能會被用戶縮放,旋轉和翻轉。 http://stackoverflow.com/questions/7915320/ios-many-images-maintaining-good-performance – spentak

+1

什麼是快速繪製drawRect中的圖像。不太快的是圖像數據的實際加載和解碼。你應該只做一次。您應該在之前的某個位置創建UIImage,然後將其翻轉,縮放或以其他方式進行轉換。不要一遍又一遍地創建它。 UIImageView可能以完全相同的方式實現,所以你的實現不是輕量級的。 – Sulthan

0

不,在我啓動我的自定義視圖並將大小尺寸放入initWithFrame之前創建圖像不是一個選項。

我不明白爲什麼這不是一個選項,但確定。你有一個財產在你的看法,self.imgName。設置此項時(其中在繪製圖像之前),您應該獲取圖像,計算其大小並在此點設置框架。