Анимация встряски для UITextField/UIView в Быстро

Я пытаюсь выяснить, как заставить текстовое поле дрожать на нажатии кнопки, когда пользователь оставляет незаполненное текстовое поле.

У меня в настоящее время есть следующая работа кода:

if self.subTotalAmountData.text == "" {

    let alertController = UIAlertController(title: "Title", message:
        "What is the Sub-Total!", preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default,handler: nil))

    self.presentViewController(alertController, animated: true, completion: nil)

} else {

}

Но я думаю, что это намного больше обратилось бы, просто имеют встряску текстового поля как предупреждение.

Я не могу найти, что что-либо анимирует текстовое поле.

Какие-либо идеи?

Спасибо!

58
задан 16 January 2015 в 20:26

2 ответа

Безопасный Swift 5

(не отказывают) встряхивают расширение для Corey Pett ответ:

extension UIView {
    func shake(for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
        let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
            self.transform = CGAffineTransform(translationX: translation, y: 0)
        }

        propertyAnimator.addAnimations({
            self.transform = CGAffineTransform(translationX: 0, y: 0)
        }, delayFactor: 0.2)

        propertyAnimator.startAnimation()
    }
}
0
ответ дан 1 November 2019 в 12:58

Я попробовал некоторые доступные решения, но ни один из них не обрабатывал полная встряска анимация: перемещение слева направо и возвращается к исходному положению.

Так, после некоторого расследования я нашел правильное решение, которое я считаю успешной встряской с помощью UIViewPropertyAnimator .

func shake(completion: (() -> Void)? = nil) {
    let speed = 0.75
    let time = 1.0 * speed - 0.15
    let timeFactor = CGFloat(time / 4)
    let animationDelays = [timeFactor, timeFactor * 2, timeFactor * 3]

    let shakeAnimator = UIViewPropertyAnimator(duration: time, dampingRatio: 0.3)
    // left, right, left, center
    shakeAnimator.addAnimations({
        self.transform = CGAffineTransform(translationX: 20, y: 0)
    })
    shakeAnimator.addAnimations({
        self.transform = CGAffineTransform(translationX: -20, y: 0)
    }, delayFactor: animationDelays[0])
    shakeAnimator.addAnimations({
        self.transform = CGAffineTransform(translationX: 20, y: 0)
    }, delayFactor: animationDelays[1])
    shakeAnimator.addAnimations({
        self.transform = CGAffineTransform(translationX: 0, y: 0)
    }, delayFactor: animationDelays[2])
    shakeAnimator.startAnimation()

    shakeAnimator.addCompletion { _ in
        completion?()
    }

    shakeAnimator.startAnimation()
}

Конечный результат:

shake-animation-result

0
ответ дан 1 November 2019 в 12:58

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

Похожие вопросы: