animateWithDuration один за другим

У меня есть метка, которая изначально расположена в центре экрана. В настоящее время он переходит из центра в правый конец экрана, а затем автоматически возвращается в исходное положение. Я хотел бы, чтобы он начал еще один animateWithDuration, чтобы он продолжался из центра, возвращаясь в левую позицию экрана, затем автореверсировался обратно в позицию и последовательно зацикливался оттуда.

Я уже пытался и успешно выполнил первую половину работы, но я не уверен, как перейти ко второй части, где начинается переход центр-> левый и цикл.

Код Swift 2.0:

   func animateRight()
    {
        UIView.animateWithDuration(1.0, delay: 0.0, options: [ .Autoreverse, .CurveEaseInOut], animations: {
                label.center.x = self.view.frame.width/2
            }, completion: { finished in
                if finished {
                    label.frame.origin.x = 0.0
                    animateLeft()
                }
        })
    }

    func animateLeft()
    {
        UIView.animateWithDuration(1.0, delay: 0.0, options: [ .Autoreverse, .CurveEaseInOut], animations: {
                label.frame.origin.x = (self.view.frame.width/2) * -1
            }, completion: { finished in
                if finished {
                    label.center.x = self.view.frame.width/2
                    animateRight()
                }
        })
    }

    // Start process
    animateRight()

person theflarenet    schedule 24.04.2016    source источник


Ответы (2)


Вы должны вызвать тот же метод анимации с продолжительностью, который вы создали для анимации справа, и вызвать в завершении. Что-то вроде этого:

func animateRight()
{
    UIView.animate(withDuration: 1.0, delay: 0.0, options: [], animations: {
        self.label.center.x = self.view.frame.width
    }, completion: { finished in
        if finished {
            self.animateLeft()
        }
    })
}

func animateLeft()
{
    UIView.animate(withDuration: 2.0, delay: 0.0, options: [ .autoreverse, .repeat, .curveEaseInOut, .beginFromCurrentState], animations: {
        self.label.frame.origin.x = 0.0
    }, completion: nil)
}
person Vitalii Boiarskyi    schedule 24.04.2016
comment
Это хорошо! Я сделал еще один шаг, но он работает неправильно. Я согласен с тем, что весь этот цикл длится вечно, потому что это просто анимация, которая будет бесконечно повторяться для визуальных эффектов. Я обновил свой код, и в настоящее время он запускает animateRight() и последовательно запускает animationLeft(); но анимацияLeft() зацикливается и никогда не вызывает animateRight(), как ожидалось. - person theflarenet; 24.04.2016
comment
Я обновил код. Так что теперь анимация вправо не использует .Autoreverse, но заканчивается справа. А затем левая анимация вызывается с помощью .Autoreverse и .Repeat. - person Vitalii Boiarskyi; 24.04.2016
comment
Превосходно! Благодарю вас! - person theflarenet; 24.04.2016

  • Вызовите defaultSetup, чтобы начать
  • Когда animationRight закончится, он вызовет animationLeft.
  • Когда animationLeft завершится, он снова вызовет animationRight, чтобы запустить цикл анимации.

Вот код:

    func defaultSetup(){
        
        self.animationRight()
    }
    
    func animationRight(){
        
        let transform = CGAffineTransform(scaleX: 1.05, y: 1.05).rotated(by: .pi/180)
        UIView.animate(withDuration: 3.0, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 3.0, options: [.allowUserInteraction, .repeat], animations: { [weak self] in
            guard let `self` = self else { return }
            self.vRight.transform = transform
            
        }, completion: { [weak self] (done) in
            guard let `self` = self else { return }
            self.vRight.transform = .identity
            self.animationLeft()
        })
    }
    
    func animationLeft(){
        let transform = CGAffineTransform(scaleX: 1.05, y: 1.05).rotated(by: .pi/180)
        UIView.animate(withDuration: 3.0, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 3.0, options: [.allowUserInteraction], animations: { [weak self] in
            guard let `self` = self else { return }
            self.vLeft.transform = transform
            
        }, completion: { [weak self] (done) in
            guard let `self` = self else { return }
            self.vLeft.transform = .identity
            self.animationRight()
        })
    }
person QuangLoc    schedule 20.01.2021