2012-01-05 7 views
12

У меня есть UIView с несколькими подзонами и признаком привязки, признанным ассоциированным, и я хочу имитировать его с эффектом «касания». То есть, когда происходит кратковременное нажатие, я хочу показать, что контейнерный вид имеет другой цвет фона, а текст любых подтипов UILabels также выглядит выделенным.Выделение UIView аналогично UIButton

Когда я получаю событие водопроводного от UITapGestureRecognizer, я могу изменить цвет фона просто отлично и даже установить UILabel на [label setHighlighted:YES];

По разным причинам, я не могу изменить UIView к UIControl.

Но если я добавлю UIViewAnimation, чтобы вернуть выделение, ничего не произойдет. Какие-либо предложения?

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

Почему бы не просто сделать его 'UIButton'? –

+0

Потому что это не кодовая база, которой я владею, и есть другие зависимости, поэтому я должен оставить ее как UIView. –

+0

Посмотрите на эту библиотеку: https://github.com/mta452/UIView-TouchHighlighting –

ответ

6

setHighlighted - это неживой объект зрения. Кроме того, вы говорите две противоположные вещи: вы устанавливаетеHighlighted на YES и NO на одном дыхании. Результатом будет то, что ничего не происходит, потому что нет общих изменений.

Используйте обработчик завершения или замедленную работу, чтобы изменить выделение позже.

EDIT:

Вы говорите, что "пытались оба, но ни работал." Возможно, вам нужно уточнить, что я имею в виду, отсроченная производительность. Я просто попытался это и она отлично работает:

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

Метка должна иметь другой textColor против его highlightedTextColor так, что-то видно случается.

+0

Пробовал оба, но не работал. Возможно, мне придется разобраться в другом творческом способе сделать это или переделать существующую кодовую базу используйте UIControl. –

0

Простое решение переопределение водопроводная жест regognizer , как показано ниже:

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

} 
Смежные вопросы