2010-06-26 3 views
0

** ... SOLVED voir l'explication sur le fond **iPhone: UIControlEventTouchUpInside incendies plusieurs fois

peut-il me donner un indice sur un contrôle mettant en lumière en réponse à UIControlEventTouchUpInside?

Ce que je veux obtenir est l'effet de surbrillance similaire à UITableViewCell, lorsque vous touchez. Dans le code suivant, je change la valeur alpha d'une vue en surbrillance lorsque l'utilisateur retouche à l'intérieur de la commande. Malheureusement, l'événement est déclenché plusieurs fois, quand on tient le pouce sur l'écran et le déplace vers le haut ou vers le bas (à mon sens, il s'agit d'un geste UIControlEventTouchDragInside). Qu'est-ce qui ne va pas? Dois-je vraiment supprimer la cible de l'événement pendant l'animation?

-(id)initWithFrame:(CGRect)frame_ 
{ 
    if (self = [super initWithFrame:frame_]) 
    { 
     ... 
     [self setMultipleTouchEnabled:NO]; 
     [self addTarget:self action:@selector(touchUpInside) forControlEvents:UIControlEventTouchUpInside]; 
    } 
    return self; 
} 

-(void)touchUpInside 
{ 
    [self setHighlighted:YES]; 
} 

-(void)animationFinished 
{ 
    // Remove the highlight animated 
    [self setHighlighted:NO]; 
} 

-(void)setHighlighted:(BOOL)highlighted_ 
{ 
    BOOL oldValue = [self isHighlighted]; 
    [super setHighlighted:highlighted_]; 
    if (highlighted_ != oldValue) 
    { 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.35f]; 
     if (highlighted_) 
     { 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDidStopSelector:@selector(animationFinished)]; 
     [[self highlightView] setAlpha:0.5f]; 
     } 
     else 
     { 
     [[self highlightView] setAlpha:0.0f]; 
     } 
     [UIView commitAnimations]; 
    } 
    ... 
} 

Le mutator setHighlighted: (BOOL) newState_ est invoquée par le cadre de l'interface utilisateur (plusieurs fois en draging le pouce sur un contrôle). Il n'est pas nécessaire de suivre les événements tactiles pour implémenter l'état en surbrillance. meilleure solution est de remplacer le mutator et imiter le nouvel état ...

-(void)setHighlighted:(BOOL)highlighted_ 
{ 
    BOOL oldValue = [self isHighlighted]; 
    if (highlighted_ != oldValue) 
    { 
     [super setHighlighted:highlighted_]; 
     // NSLog(@"highlighted: %d", highlighted_); 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.35f]; 
     [[self highlightView] setAlpha:(highlighted_?0.5f:0.0f)]; 
     [UIView commitAnimations]; 
    } 
} 

Et peut-être, l'événement TouchUpInside est tiré une fois ... comme prévu.

Merci, MACtouch

Répondre

1

Oui, cela est un problème commun, et peut-être un bogue dans iPhone.

Mais la solution est simple, vous pouvez définir une variable d'instance dans votre classe de contrôleur de vue et contrôler cette variable lorsque votre fonction est appelée.

Quelque chose comme ça

your_method { 
    if(control_var) 
     control_var=NO; 
    else { 
     //APPLICATION LOGIC 
     control_var=YES; 
    } 
} 
+0

OK, merci. Enfin trouvé une solution. Lorsque l'utilisateur touche un contrôle (avec interaction utilisateur activée), le mutateur/setter setHighlighted est automatiquement appelé par le framework. Il n'est pas nécessaire de suivre les événements tactiles pour afficher l'état en surbrillance. Si la valeur de la propriété change, il suffit de présenter cet état (dans une méthode setHighlighted surchargée ou en utilisant KVO). J'ai ajouté l'implémentation correcte dans mon post de question. – MacTouch