Указывает на ошибку, заставляя элемент интерфейса мигать
У меня есть представление, где пользователь должен сделать выбор, прежде чем кнопка будет работать. Чтобы сделать это более очевидным, я хочу, чтобы элемент, представляющий выбор, который должен быть сделан, мигал, если сначала нажата кнопка (выделена серым цветом). Т.е. я хочу указать, что это ошибка в этом состоянии, и привлечь внимание пользователя к элементу пользовательского интерфейса, который он должен использовать в первую очередь.
Моя текущая попытка получить элемент (self.display
в приведенном ниже коде) два раза быстро мигает следующее:
@IBAction func inactiveButtonClick() {
let period = 0.16
UIView.animate(withDuration: period/2, delay: 0.0, options: [.curveEaseInOut, .autoreverse, .repeat], animations: {
self.display.alpha = 0
}, completion: { _ -> Void in
self.display.alpha = 1
})
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + period*2, execute: {
self.display.layer.removeAllAnimations()
})
}
Это работает довольно хорошо, но не на 100% правильно, и анимация иногда обрезается за доли секунды до ее завершения. Я думаю, я мог бы поставить в очередь две анимации, но мне интересно, есть ли более простой способ сделать это. Существуют ли какие-либо встроенные способы мигания элемента пользовательского интерфейса, чтобы указать на ошибку? Если нет, есть ли какие-либо "известные хорошие" комбинации кривых и частот, которые передают это пользователю?
1 ответ
Анимации ключевых кадров кажутся идеально подходящими в этом сценарии:
UIView.animateKeyframes(withDuration: period, delay: 0.0, options: [], animations: {
UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5, animations: {
self.display.alpha = 0
});
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: {
self.display.alpha = 1
});
}, completion: nil);
Таким образом, вы сначала создаете анимацию ключевого кадра с продолжительностью периода. Внутри блока анимации вы можете добавить пользовательские анимации ключевых кадров, указав относительное время начала (от 0 до 1 - 1 beign конец анимации ключевых кадров, так что ваша продолжительность).
Итак, сначала мы добавляем анимацию, которая начинается в начале, и ее относительная длительность равна 0,5, т.е. 1/2 от общей продолжительности анимации. Вторая анимация начнется, когда первая закончится с 1/2 общей анимации, и продолжится в течение оставшейся половины времени анимации.
Надеюсь это поможет