drawRect n'est pas appelé pour la sous-classe UIButton personnalisée lorsqu'il est mis en surbrillance

StackOverflow https://stackoverflow.com/questions/823524

  •  05-07-2019
  •  | 
  •  

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?

Était-ce utile?

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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top