Выделение 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
}];
}
Ответы
Ответ 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
})
}
}
}
}