【问题标题】:Xcode 10 - let code wait for finished animationsXcode 10 - 让代码等待完成的动画
【发布时间】:2019-06-04 14:06:46
【问题描述】:

我有一个淡入淡出的淡入淡出序列。但是,代码的执行不会等到单个淡入淡出动画(fadeIn、fadeOut)完成。 fadeIn 完成后如何触发fadeOut?

到目前为止,这是我的基本代码:

 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()

}

我的基本问题是对补全部分的理解。

【问题讨论】:

    标签: xcode animation


    【解决方案1】:

    您似乎在这里问了两个问题:

    1. 你怎么打电话给fadeOutfadeIn打完了?
    2. 如何等到fadeSequence 完成后再调用它?

    问题 #1

    如果你总是想在运行fadeIn后直接调用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: { 
                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)
    

    【讨论】:

    • 在我尝试您的代码时出现一些错误:问题#2 的第 2 行中的“传递给不带参数的调用的参数”
    • 您是否在fadeInfadeOut 方法中将完成处理程序实现为参数?
    • 刚刚把你的代码带进来让我明白了。对我来说,很难确定哪个是通用的,哪个是可以编写代码的。完成处理程序是一些奇怪的东西。
    • 好的,func fadeIn(completion: () -&gt; Void) {func fadeOut(completion: () -&gt; Void) { 也是如此。那么这应该是固定的。
    • completion:completion 给出错误:将非转义参数“completion”传递给期望@escaping 闭包的函数
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2014-05-22
    • 2022-01-19
    • 2019-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多