2010-02-18 5 views
23

Je les extraits de code suivants:iPhone UIButton Highlighted

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

@implementation Foo

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

Quand je lance l'application, le bouton est en bleu (comportement par défaut). Cela fonctionne comme je m'y attendais. Mais après avoir appuyé une fois sur le bouton, le bouton n'est plus surligné.

Ensuite, j'ai créé un IBActionhighlightButton pour gérer Touch Up Inside événement où j'appelle explicitement myButton.highlighted = Yes;. Malheureusement, la surbrillance du bouton ne reste pas.

Comment puis-je le maintenir surligné en bleu même après avoir été pressé?

+1

Serait-il plus facile de simplement changer la couleur du bouton? :) – willcodejavaforfood

+0

Voir ma question [ici] (http://stackoverflow.com/questions/1934861/uibutton-border-and-background-image). –

+0

Merci pour le conseil. Je n'utilise aucune image. Je viens d'utiliser du texte en appelant "[myButton setTitle: @" Foo "forState: UIControlStateNormal]". – pion

Répondre

45

La solution est de faire [button setHighlighted:YES] dans la prochaine runloop:

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

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

Fonctionne parfaitement. – spa

+0

Merci Werner. Pourriez-vous expliquer pourquoi nous devons le mettre dans le prochain runloop? Est-ce que le bouton n'est pas redessiné lorsque nous appelons cette méthode particulière? –

+2

Le problème est l'appel du framework iOS onTouchup (le gestionnaire d'événements) et ensuite le bouton (non mis en surbrillance: NON). L'appel de setHighlighted dans le gestionnaire d'événements n'a donc aucun effet. –

7

Une autre façon d'exécuter ceci est par l'envoi d'un bloc à la file d'attente d'opération principale:

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

Oh wow. Comment diable aurais-je découvert cela sans StackOverflow? –

13

Le code simple est ici.

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

la meilleure option. Ne fait pas clignoter le bouton brièvement à l'état normal après que l'utilisateur lève le doigt. –

+0

Sans compter que cette façon vous permet d'effectuer cela avec plusieurs boutons dans une vue et le garder très propre. – CaptJak

+0

Je me demandais juste ... le bloc "gdc" ici est libéré de la mémoire après que ce soit fait correctement? – lppier

Questions connexes