2012-01-05 12 views
12

Mam UIView z wieloma subviewsami i rozpoznanym skojarzonym gestem Tap i chcę naśladować to działanie "dotykowe". Oznacza to, że gdy pojawia się dotknięcie, chcę pokazać widok kontenera, aby inny kolor tła i tekst wszystkich widoków podrzędnych UILabeli również wyglądał podświetlony.Wyróżnianie UIView podobnego do UIButton

Kiedy odebrać zdarzenie kranu z UITapGestureRecognizer mogę zmienić kolor tła w porządku, a nawet ustawić UILabel do [label setHighlighted:YES];

Z różnych powodów, nie mogę zmienić UIView do UIControl.

Ale jeśli dodaję UIViewAnimation, aby przywrócić wyróżnienie, nic się nie dzieje. Jakieś sugestie?

- (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

Dlaczego nie po prostu zrobić to 'UIButton'? –

+0

Ponieważ nie jest to mój kod bazowy i istnieją inne zależności, więc muszę zostawić to jako UIView. –

+0

Spójrz na tę bibliotekę: https://github.com/mta452/UIView-TouchHighlighting –

Odpowiedz

6

setHighlighted nie jest animowalną właściwością widoku. Dodatkowo mówisz o dwóch przeciwnych rzeczach: ustawiłeś HIGH na TAK i NIE w tym samym oddechu. W rezultacie nic się nie stanie, ponieważ nie ma żadnych ogólnych zmian.

Użyj podpórki zakończenia lub opóźnionej wydajności, aby zmienić wyróżnienie później.

EDYTOWANIE:

Mówisz "próbowałem obu, ale nie zadziałało." Być może potrzebujesz wyjaśnienia, co rozumiem przez opóźnioną wydajność. Właśnie próbowałem i działa idealnie:

- (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; 
    }); 
} 

Etykieta musi mieć inną textColor vs jego highlightedTextColor tak widoczne, że coś się dzieje.

+0

Próbowałem obu, ale nie działało. Być może muszę wymyślić inny twórczy sposób, aby to zrobić lub przełączyć istniejącą bazę do korzystaj z UIControl. –

0

Proste rozwiązanie jest przesłanianie tap gest regognizer jak poniżej:

Swift 4.x

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 
       }) 
      } 
     } 
    } 

}