Кажется, вы задаете два вопроса здесь:
- Как звонить
fadeOut
, после того, как fadeIn
закончено?
- Как вы ждете, пока не закончится
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)