Xcode 10 - пусть код ждет готовой анимации - PullRequest
0 голосов
/ 04 июня 2019

У меня есть последовательность постепенного исчезновения, за которым следует постепенное исчезновение. Однако выполнение кода не ждет, пока не закончится одна анимация постепенного изменения (fadeIn, fadeOut). Как запустить fadeOut после завершения fadeIn?

Вот мой основной код:

 func fadeIn(){
    if self.alpha == 0.0 {
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0,
        delay: 2.0,
        options:[.curveLinear],
        animations: {self.alpha = 1.0},
        completion: {if $0 == .end{print("FadeIn finished now")}})
    }

}


func fadeOut(){
    if self.alpha == 1.0 {
        UIViewPropertyAnimator.runningPropertyAnimator(
            withDuration: 3.0,
            delay: 2.0,
            options:[.curveLinear],
            animations: {self.alpha = 0},
            completion: {if $0 == .end{print("FadeOut finished now")}})
    }

}

//connect single Fades
func fadeSequence(){
   self.fadeIn()
    self.fadeOut()
}

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

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

for item in 0..<4{
print("runthrough:\(item)")

myView.fadeSequence()

}

Моя основная проблема - понимание части завершения.

1 Ответ

1 голос
/ 04 июня 2019

Кажется, вы задаете два вопроса здесь:

  1. Как звонить fadeOut, после того, как fadeIn закончено?
  2. Как вы ждете, пока не закончится fadeSequence, прежде чем вызывать его снова?

Вопрос № 1

Если вы всегда хотите вызвать fadeOut сразу после запуска fadeIn, вы можете просто сделать это:

func fadeIn(completion: @escaping () -> Void) {
    guard alpha == 0 else { return }
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0, delay: 2.0, options:[.curveLinear],
        animations: {
            self.alpha = 1.0
        },
        completion: { 
            self.fadeOut() 
        }
    )
}

Тогда fadeSequence будет звонить только fadeIn().

Однако вы можете изменить логику для обработки завершения внутри fadeSequence, что немного более универсально, потому что тогда вы можете независимо вызывать fadeOut:

func fadeIn(completion: @escaping () -> Void) {
    guard alpha == 0 else { return }
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0, delay: 2.0, options:[.curveLinear],
        animations: {
            self.alpha = 1.0
        },
        completion: completion
    )
}

func fadeSequence() {
    fadeIn(completion: fadeOut)
}

Вопрос № 2

Добавьте обработчик завершения к fadeSequence и затем вызовите его рекурсивно. Это также требует fadeOut для реализации обработчика завершения, как мы добавили его в fadeIn.

func fadeSequence(numberOfCalls n: Int) {
    guard n > 0 else { return }
    fadeIn {
        self.fadeOut {
            fadeSequence(numberOfCalls: n-1)
        }
    }
}

Полный код:

func fadeIn(completion: @escaping () -> Void) {
    guard alpha == 0 else { return completion() }
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0, delay: 2.0, options:[.curveLinear],
        animations: {
            self.alpha = 1
        },
        completion: completion
    )
}

func fadeOut(completion: @escaping () -> Void) {
    guard alpha == 1 else { return completion() }
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0, delay: 2.0, options:[.curveLinear],
        animations: {
            self.alpha = 0
        },
        completion: completion
    )
}

func fadeSequence(repeat n: Int = 1) {
    guard n > 0 else { return }
    fadeIn {
        self.fadeOut {
            fadeSequence(repeat: n-1)
        }
    }
}

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