2012-01-05 18 views
12

Ho un UIView con un numero di subviews e un gesto Tap riconosciuto associato e voglio imitarlo con un effetto 'tocco'. Cioè, quando si verifica il rubinetto, voglio mostrare la vista del contenitore per avere un colore di sfondo diverso e anche il testo di qualsiasi sottoview UILabels per sembrare evidenziato.Evidenziazione di un UIView simile a UIButton

Quando ricevo l'evento rubinetto da UITapGestureRecognizer, posso cambiare il colore di sfondo più che bene e anche impostare l'UILabel a [label setHighlighted:YES];

Per vari motivi, non posso cambiare l'UIView a UIControl.

Ma se aggiungo un UIViewAnimation per annullare l'evidenziazione, non succede nulla. Eventuali suggerimenti?

- (void)handleTapGesture:(UITapGestureRecognizer *)tapGesture { 
     [label setHighlighted:YES]; // change the label highlight property 

[UIView animateWithDuration:0.20 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseIn 
        animations:^{ 
         [containerView setBackgroundColor:originalBgColor];   
         [label setHighlighted:NO]; // Problem: don't see the highlight reverted 
        } completion:^(BOOL finished) {       
         // nothing to handle here 
        }];  
} 
+0

Perché non solo lo rendono un 'UIButton'? –

+0

Perché non è un codebase che possiedo e ci sono altre dipendenze quindi devo lasciarlo come UIView. –

+0

Dai un'occhiata a questa libreria: https://github.com/mta452/UIView-TouchHighlighting –

risposta

6

setHighlighted non è una proprietà di visualizzazione animabile. Inoltre, stai dicendo due cose opposte: tieni l'Highlighted a YES e NO nello stesso respiro. Il risultato sarà che non succede niente perché non c'è un cambiamento generale.

Utilizzare il gestore di completamento o la prestazione ritardata per modificare l'evidenziazione in seguito.

EDIT: "provato entrambi, ma non lavorato"

Lei dice Forse hai bisogno di chiarimenti su cosa intendo per prestazioni ritardate. Ho appena provato questo e funziona perfettamente:

- (void) tapped: (UIGestureRecognizer*) g { 
    label.highlighted = YES; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     label.highlighted = NO; 
    }); 
} 

L'etichetta deve avere un diverso textColor vs sua highlightedTextColor in modo che qualcosa di visibile accade.

+0

Provato entrambi, ma nessuno dei due ha funzionato .. Potrei dover trovare un altro modo creativo per farlo o andare a ricablare la base di codice esistente per utilizzare UIControl. –

0

soluzione più semplice è di rubinetto di esclusione gesto regognizer come di seguito:

4.x Swift

class TapGestureRecognizer: UITapGestureRecognizer { 
    var highlightOnTouch = true 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesBegan(touches, with: event) 

     if highlightOnTouch { 
      let bgcolor = view?.backgroundColor 
      UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveLinear], animations: { 
       self.view?.backgroundColor = .lightGray 
      }) { (_) in 
       UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveLinear], animations: { 
        self.view?.backgroundColor = bgcolor 
       }) 
      } 
     } 
    } 

} 
Problemi correlati