2009-05-05 12 views
2

UIButtonサブクラスにdrawRectを使用すると、ハイライトされたときにボタンを描画するように呼び出されることはありません。タッチイベントでボタンのsetNeedsDisplayを呼び出す必要がありますか?UIButtonサブクラスにdrawRectを使用する場合

+0

回答: http://stackoverflow.com/questions/4022763/change-background-color-of-uibutton-when-highlighted – GoldenBoy

答えて

6

私が知る限り、UIButtonをサブクラス化する方法はありません。

UIButtonは、イニシャライザによって返される実際のクラスタイプではありません。 UIButtonは、一連のプライベートクラスのフロントの一種です。

は、あなたが持っていたと言う:

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

あなたがログに返されるタイプは、「UIRoundedRectButton」であることがわかります。問題は、あなたが "UIRoundedRectButton"を拡張する必要があるということです。 UIButtonに返されるのはプライベートクラスなので、これは不可能です。

"UIRoundedRectButton"はすべてがプライベートである唯一の返されるクラスではありません。

つまり、UIButtonは、拡張に適さない方法で構築されました。

+0

はい、それは私が発見したものの一種です。さらに、UIButtonは描画するためにdrawRectを使用していないようです。それは私のdrawRectを呼び出し、次に先に進んで、私が描いたもののビットマップを爆破します。そして、私はsuperのdrawRectと呼んでいません。 代わりにUIControlをサブクラス化しましたが、私はUIButtonが提供していたタップのハイライトを見逃しています。 – mahboudz

+0

その痛みですが、私はリンゴは私たちがクラスを拡張したいと思っていないと思います...クラスはそれを扱うことができませんまたは彼らは言語の構造のビジョンに従うために使用することを強制しています私はちょうど知らない:) – abe

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]; 
} 

これだけです!ここ

+0

うわー!ありがとうございました。ありがとう;) –

関連する問題