drawRect n'est pas appelé pour la sous-classe UIButton personnalisée lorsqu'il est mis en surbrillance
Question
Lorsque vous utilisez drawRect pour une sous-classe UIButton personnalisée, il ne semble jamais être appelé pour dessiner le bouton lorsqu'il est en surbrillance. Dois-je appeler setNeedsDisplay pour mon bouton dans mes événements tactiles?
La solution
Autant que je sache, il n’existe pas de moyen simple de sous-classer UIButton.
UIButton n'est pas le type de classe réel renvoyé par les initialiseurs. UIButton est une sorte de front pour une série de cours privés.
Dites que vous aviez:
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
NSLog(@"myButton type: %@", [myButton description]);
Vous constaterez que le type renvoyé dans le journal est "UIRoundedRectButton". Le problème, c’est que vous auriez besoin d’avoir étendu "UIRoundedRectButton". Ce n'est pas possible car c'est une classe privée qui n'est retournée qu'à UIButton.
En plus de cela "UIRoundedRectButton" n'est pas la seule classe retournée possible, toutes privées.
En d'autres termes, UIButton a été construit de manière à ne pas pouvoir être étendu.
Autres conseils
J'ai trouvé une solution facile.
Ajoutez simplement la méthode suivante à votre sous-classe UIButton:
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
C'est tout!
J'ai eu le même problème et un succès satisfaisant avec les éléments suivants ajoutés à ma sous-classe UIButton
- (void)awakeFromNib {
[self addTarget:self action:@selector(redraw) forControlEvents:UIControlEventAllEvents];
}
- (void)redraw {
[self setNeedsDisplay];
[self performSelector:@selector(setNeedsDisplay) withObject:self afterDelay:0.15];
}