Pregunta

Cuando se usa drawRect para una subclase de UIButton personalizada, parece que nunca se llama para dibujar el botón cuando está resaltado. ¿Debo llamar a setNeedsDisplay para mi botón en mis eventos táctiles?

¿Fue útil?

Solución

Por lo que puedo decir, no hay un camino directo hacia la subclase UIButton.

UIButton no es el tipo de clase real que devuelven los inicializadores. UIButton es una especie de frente para una serie de clases privadas.

Diga que tenía:

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

Encontrará que el tipo devuelto en el registro es " UIRoundedRectButton " ;. El problema con eso es que necesitarías haber extendido " UIRoundedRectButton " ;. Eso no es posible ya que es una clase privada que solo se devuelve a UIButton.

Además de ese " UIRoundedRectButton " no es la única clase devuelta posible, todas las cuales son privadas.

En otras palabras, UIButton se construyó de manera que no se puede extender.

Otros consejos

Encontré una solución fácil.

Simplemente agregue el siguiente método a su subclase UIButton:

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

Eso es todo!

Tuve el mismo problema y éxito satisfactorio con el siguiente agregado a mi UIButton subclass

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

- (void)redraw {
    [self setNeedsDisplay];
    [self performSelector:@selector(setNeedsDisplay) withObject:self afterDelay:0.15];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top