Выделение UIView похож на UIButton - PullRequest
14 голосов
/ 05 января 2012

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

Когда я получаю событие касания от 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
                     }];    
}

Ответы [ 2 ]

6 голосов
/ 05 января 2012

setHighlighted не является анимируемым свойством просмотра. Кроме того, вы говорите две противоположные вещи: вы выделили выделенное значение ДА и НЕТ на одном дыхании. В результате ничего не произойдет, потому что нет общих изменений.

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

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, чтобы что-то видимое происходило.

3 голосов
/ 09 января 2018

Простое решение - распознавание жестов касанием, как показано ниже:

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

}
...