Swift: две анимации одна за другой - PullRequest
0 голосов
/ 30 сентября 2018

У меня маленькая проблема с анимацией, в которой я застреваю.Я хочу показать две анимации, одну за другой (сначала проведите карточкой от кнопки к центру, а затем переверните ее).Поэтому я использую завершение в методе UIView.animate, чтобы запустить вторую анимацию после завершения первой.Но в симуляторе он показывает каждый раз только вторую анимацию.Может кто-нибудь помочь?Большое спасибо

UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut, animations: {
    let animation:CABasicAnimation = CABasicAnimation(keyPath: "position")
    animation.fromValue = NSValue(cgPoint:CGPoint(x: self.imgBackOfTheCard.frame.midX, y: 1200))
    animation.toValue = NSValue(cgPoint:CGPoint(x: self.imgBackOfTheCard.frame.midX, y: self.imgBackOfTheCard.frame.midY))
    animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
    animation.duration = 1
    self.imgBackOfTheCard.layer.add(animation, forKey: "position")
    }, completion: { (finished: Bool) in
        UIView.animate(withDuration: 1, delay: 1, options: .curveLinear, animations: {
            let transitionOptionsLeft: UIView.AnimationOptions = [.transitionFlipFromLeft, .showHideTransitionViews]
            UIView.transition(from: self.imgBackOfTheCard, to: self.imgFrontCard, duration: 1, options: transitionOptionsLeft, completion: nil)
        })
})

1 Ответ

0 голосов
/ 30 сентября 2018

Вы смешиваете анимацию CA и анимацию UIView.

Первая анимация - это CABasicAnimation.UIView.animate не распознает его, поэтому первая анимация «завершается» (что касается UIView.animate) немедленно и вызывается завершение завершения.Теперь вы делаете еще одну UIView анимацию.Но на самом деле первая анимация только начинается, поэтому вторая анимация вступает во владение, и вы видите только вторую.

Чтобы это исправить, вы должны переместить первую анимацию из блока UIView.animate:

let animation:CABasicAnimation = CABasicAnimation(keyPath: "position")
animation.fromValue = NSValue(cgPoint:CGPoint(x: self.imgBackOfTheCard.frame.midX, y: 1200))
animation.toValue = NSValue(cgPoint:CGPoint(x: self.imgBackOfTheCard.frame.midX, y: self.imgBackOfTheCard.frame.midY))
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
animation.duration = 1
self.imgBackOfTheCard.layer.add(animation, forKey: "position")

А затем подождите 1 секунду, затем выполните вторую анимацию:

DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
   // do your second animation here.
})

При дальнейшей проверке первая анимация не обязательно должна быть CABasicAnimation.Его также можно создать с помощью UIView.animate.Просто установите свойство frame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...