Запуск двух анимаций одновременно

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

Я хочу анимировать положение обоих представлений при выполнении второй анимации, которая transitionFlipFromBottom

Вот код:

let initialFrame = CGRect(x: xpos, y: -310, width: 300, height: 300)

let firstView = UIView()
firstView.backgroundColor = .red
firstView.frame = initialFrame

let secondView = UIView()
secondView.backgroundColor = .white
secondView.frame = initialFrame
secondView.isHidden = false


self.view.addSubview(firstView)
self.view.addSubview(secondView)


// Here I try to move the views on screen while fliping them
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut, animations: {
    secondView.center = self.view.center
    firstView.center = self.view.center
    self.flip(firstView: firstView, secondView: secondView)
}, completion: nil)



// This function flips the views vertically while it animates the transition from the first to the second view
fileprivate func flip(firstView: UIView, secondView: UIView) {
    let transitionOptions: UIViewAnimationOptions = [.transitionFlipFromBottom, .showHideTransitionViews]
    UIView.transition(with: firstView, duration: 0.5, options: transitionOptions, animations: {
        firstView.isHidden = true
    })

    UIView.transition(with: secondView, duration: 0.5, options: transitionOptions, animations: {
        secondView.isHidden = false
    })
}

Приведенный выше код не может выполнить обе анимации одновременно.

Это работает только в том случае, если я помещаю вызов функции flip внутри блока completion после завершения первой анимации (движущегося кадра), как показано ниже:

UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut, animations: {
    secondView.center = self.view.center
    firstView.center = self.view.center
}, completion: {(_) in
    self.flip(firstView: dummyView, secondView: newGroupView)
})

Я даже пытался использовать UIView.animateKeyframes, но он все еще не работает.

Я что-то упустил здесь?

Спасибо.


person Ivan Cantarino    schedule 18.01.2018    source источник
comment
Вы должны проверить координаторов и UIViewControllerTransitioningDelegate, это будет очень полезно для вас!   -  person Sacha.R    schedule 18.01.2018
comment
Я посмотрю на это; но я не думаю, что UIViewControllerTransitioningDelegate здесь полезен, потому что это простая анимация просмотра на экране, а не переход между ViewControllers, но я думаю, что coordinators может быть полезен   -  person Ivan Cantarino    schedule 18.01.2018


Ответы (1)


Несколько вещей:

  1. В transition укажите опцию .allowAnimatedContent.

  2. Отложить анимацию:

    DispatchQueue.main.async {
        UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseOut], animations: {
            secondView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
            firstView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
            self.flip(firstView: firstView, secondView: secondView)
        }, completion: { _ in
        })
    }
    
  3. Несколько несвязанные, вы не хотите:

    secondView.center = self.view.center
    

    Вместо этого выполните:

    secondView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
    

    Вы хотите установить secondView.center в координатном пространстве bounds из view, а не в superview из view.

person Rob    schedule 18.01.2018
comment
Отличный ответ :) хотя я уже решил проблему, ваш ответ более полный, поэтому я его приму :) - person Ivan Cantarino; 18.01.2018