Указывает на ошибку, заставляя элемент интерфейса мигать

У меня есть представление, где пользователь должен сделать выбор, прежде чем кнопка будет работать. Чтобы сделать это более очевидным, я хочу, чтобы элемент, представляющий выбор, который должен быть сделан, мигал, если сначала нажата кнопка (выделена серым цветом). Т.е. я хочу указать, что это ошибка в этом состоянии, и привлечь внимание пользователя к элементу пользовательского интерфейса, который он должен использовать в первую очередь.

Моя текущая попытка получить элемент (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 общей анимации, и продолжится в течение оставшейся половины времени анимации.

Надеюсь это поможет

Другие вопросы по тегам