2010-04-10 34 views
38

我有子類UIImageView,並試圖覆蓋drawRect,所以我可以使用Quartz 2D繪製圖像的頂部。我知道這是一個愚蠢的新手問題,但我沒有看到我做錯了什麼。這裏的接口:drawRect沒有在我的UIImageView的子類中調用

#import <UIKit/UIKit.h> 

@interface UIImageViewCustom : UIImageView { 

} 
- (void)drawRect:(CGRect)rect; 
@end 

和實現:

#import "UIImageViewCustom.h" 

@implementation UIImageViewCustom 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // do stuff 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

我設置drawRect斷點,它從來沒有擊中,導致我覺得它永遠不會被調用。當視圖第一次加載時不應該調用它嗎?我錯誤地覆蓋了它嗎?

+0

請參閱最新的答案,抱歉再次打擾你。 – 2010-04-10 05:09:56

+0

okies。通過文檔我觀察它會工作,如果你製作的UIView而不是UIIMageView的子類,現在你可以在你的子類中添加UIImageView的屬性,我做了一次繪製我的tableview單元格的背景,爲更多的細節,你可以檢查athttp://stackoverflow.com/questions/1784827/draw-a-custom-cell-for-tableview-uitableview-with-changed-colors-and-separa – 2010-04-10 05:33:50

回答

80

只有在視圖可見和髒的情況下才會調用它。也許問題出在創建視圖的代碼中,或者在你的Nib中,如果這就是你創建視圖的方式?

如果您嘗試調試「Release」版本,您有時也會看到斷點無法正確設置。


我不知何故錯過了第一次,你是繼承UIImageView。從文檔:

特別注意事項

UIImageView類進行了優化, 繪製它的圖像顯示。 UIImageView將不會調用drawRect:在 子類中。如果您的子類需要 自定義繪圖代碼,建議您使用UIView作爲基類 。

所以你有它。鑑於使用[UIImage drawInRect:]或通過使用CALayer將圖像繪製到視圖中是多麼容易,無論如何可能沒有任何理由繼承UIImageView。

+0

不應該drawRect當視圖是第一次調用時雖然渲染? – 2010-04-10 04:50:35

+0

其實,現在你提到它了,我記得那是在讀。不知道爲什麼我在找它時找不到它。謝謝。 – 2010-04-10 14:45:38

+1

如果你想使用IB,UIImageView是能夠子類化的好東西。唉......謝謝你的回答,它有幫助。 – 2011-10-15 23:33:29

0

不能直接回答你的問題,但可以解決你的問題:

爲什麼這樣做具有的UIImageView的子類?子類化總是會有問題,特別是對於沒有被設計成子類的類 - 我敢打賭,UIImageView不是。如果你只想在圖像上繪製東西,然後創建一個透明背景的視圖,繪製任何你想要的,並將其直接放在圖像上。

+1

好的,很好,我在文檔中查了一下,顯然子類化很好。我仍然懷疑這不是實現目標的最佳方式。 – jasoncrawford 2010-04-11 22:08:05

1

嘗試添加

編輯:

- (id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     [self setClearsContextBeforeDrawing:YES];//add this line also 
    } 
    return self; 
} 


- (void)setNeedsDisplay{ 
    [self setNeedsDisplayInRect:self.frame]; 
} 

到你的代碼。

希望這有助於。

感謝,

madhup

+0

感謝您的建議,但那也不起作用:-( – 2010-04-10 05:00:51

+0

更新也不起作用。 – 2010-04-10 05:16:32

+0

clearsContextBeforeDrawing默認是YES! – daveoncode 2011-09-24 11:57:03

-1

我猜的UIImageView不能用它來重寫的drawRect

0

根據您的具體情況下,它可能是有意義的使用UIButton與背景圖像,而不是UIImageView。您甚至可以將userInteractionEnabled設置爲NO,並且結果與UIImageView無法區分。

在這種情況下,您UIButton子者將只包括:

- (void)drawRect:(CGRect)rect 
{ 
    if (kSomethingSpecial) { 
    [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] 
        forState:UIControlStateNormal]; 
    } 
} 

免責聲明 - 我只推薦這個,如果你有計劃要使用圖像作爲按鈕至少一些的時間。我不能全心全意地認可使用UIButton作爲UIImageView中此drawRect行爲的解決方法,因爲我確信Apple有這種方式編寫API的原因,如Mark引用。

相關問題