2009-05-05 67 views
2

當使用drawRect作爲UIButton子類時,我看起來好像從未被調用以在高亮時繪製按鈕。我需要在觸摸事件中爲我的按鈕調用setNeedsDisplay嗎?當爲UIButton子類使用drawRect時

+0

答案在這裏: http://stackoverflow.com/questions/4022763/change-background-color-of-uibutton-when-highlighted – GoldenBoy 2011-12-02 21:45:25

回答

6

據我所知,沒有直接的方法來繼承UIButton。

UIButton不是初始化程序返回的實際類類型。 UIButton是一系列私人課程的前沿。

假設您有:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
NSLog(@"myButton type: %@", [myButton description]); 

你會發現在日誌中返回的是「UIRoundedRectButton」類型。這個問題是你需要擴展「UIRoundedRectButton」。這是不可能的,因爲它是一個私人類,只有返回到UIButton。

最重要的是,「UIRoundedRectButton」不是唯一可能的返回類,它們都是私有的。

換句話說,UIButton的構建方式不適合擴展。

+0

是的,這就是那種我所發現的。另外,UIButton似乎並不使用drawRect來繪製自己。它會調用我的drawRect,然後繼續,並將任何位圖直接渲染到我繪製的位置上 - 而且我不會調用超級的drawRect。 我改爲UIControl的子類,但我想念突出顯示UIButton提供的點擊。 – mahboudz 2009-07-08 04:42:58

+0

它的痛苦,但我不認爲蘋果希望我們延長課程......它的原因類不能處理它,或者他們正在強制使用跟隨那裏的語言結構的視覺我只是不知道:) – abe 2009-07-08 08:37:24

1

我有同樣的問題,並滿足成功與下面添加到我的UIButton

- (void)awakeFromNib { 
    [self addTarget:self action:@selector(redraw) forControlEvents:UIControlEventAllEvents]; 
} 

- (void)redraw { 
    [self setNeedsDisplay]; 
    [self performSelector:@selector(setNeedsDisplay) withObject:self afterDelay:0.15]; 
} 
11

我知道這是一個老問題,但我遇到了同樣的問題,找到了一個簡單的解決方案:

只需將以下方法添加到您的UIButton子類中:

-(void)setHighlighted:(BOOL)highlighted 
{ 
    [super setHighlighted:highlighted]; 
    [self setNeedsDisplay]; 
} 

就是這樣!