Подтвердить что ты не робот

Выделение UIView аналогично UIButton

У меня есть 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
                     }];    
}
4b9b3361

Ответ 1

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 vs ее highlightedTextColor, чтобы произошло что-то видимое.

Ответ 2

Простым решением является переопределитель жесты жесткого диска как показано ниже:

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

}