2010-02-18 14 views
23

He los siguientes fragmentos de código:iPhone UIButton destacado

@interface Foo: UIViewController { 
    ... 
    UIButton *myButton; 
    ... 
} 

@implementation Foo

- (void) viewDidLoad { 
    ... 
    myButton.highlighted = YES; 
    ... 
} 

Cuando ejecuto la aplicación, el botón se resalta en azul (comportamiento predeterminado). Funciona como esperaba.

Pero después de presionar el botón una vez, el botón ya no se resalta.

A continuación, he creado un IBActionhighlightButton para manejar Touch Up Inside evento en el que explícitamente llamo myButton.highlighted = Yes;. Desafortunadamente, el botón resaltado aún no se mantiene.

¿Cómo puedo mantenerlo resaltado en azul incluso después de presionarlo?

+1

¿Sería más fácil simplemente cambiar el color del botón? :) – willcodejavaforfood

+0

Consulte mi pregunta [aquí] (http://stackoverflow.com/questions/1934861/uibutton-border-and-background-image). –

+0

Gracias por el consejo. No estoy usando ninguna imagen. Solo uso el texto llamando a "[myButton setTitle: @" Foo "forState: UIControlStateNormal]". – pion

Respuesta

45

La solución es hacer [button setHighlighted:YES] en la siguiente runloop:

- (void)highlightButton:(UIButton *)b { 
    [b setHighlighted:YES]; 
} 

- (IBAction)onTouchup:(UIButton *)sender { 
    [self performSelector:@selector(highlightButton:) withObject:sender afterDelay:0.0]; 
} 
+0

Funciona a la perfección. – spa

+0

Gracias Werner. ¿Podrías explicar por qué tenemos que establecerlo en el próximo runloop? ¿El botón no se vuelve a dibujar cuando llamamos a este método en particular? –

+2

El problema es que el marco iOS llama aTouchup (el controlador de eventos) y luego desmarca el botón (setHighlighted: NO). Entonces, llamar a setHighlighted en el controlador de eventos no tiene ningún efecto. –

7

Una forma alternativa para ejecutar este es mediante el envío de un bloque de la principal cola de operaciones:

-(void)onTouchup:(UIButton*) button 
{ 
    [NSOperationQueue.mainQueue addOperationWithBlock:^{ button.highlighted = YES; }]; 
} 
+3

Oh wow. ¿Cómo diablos habría descubierto esto sin StackOverflow? –

13

El código más simple es aquí.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [button setHighlighted:YES]; 
}); 
+0

la mejor opción. No hace que el botón parpadee brevemente al estado normal después de que el usuario levanta el dedo. –

+0

Sin mencionar que de esta manera le permite realizar esto con varios botones en una vista y mantenerlo MUY ordenado. – CaptJak

+0

Sólo me pregunto ... el bloque "gdc" aquí se libera de la memoria después de que se hace ¿verdad? – lppier

Cuestiones relacionadas