Swift上的块(animateWithDuration:动画:完成:)

时间:2014-06-05 22:37:06

标签: ios swift closures

我无法让这些块在Swift上运行。这是一个有效的例子(没有完成块):

UIView.animateWithDuration(0.07) {
    self.someButton.alpha = 1
}

或者没有尾随闭包:

UIView.animateWithDuration(0.2, animations: {
    self.someButton.alpha = 1
})

但是一旦我尝试添加完成块,它就不会工作:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    self.blurBg.hidden = true
})

自动填充功能为我提供了completion: ((Bool) -> Void)?但不确定如何使其正常工作。也尝试使用尾随闭包,但得到了同样的错误:

! Could not find an overload for 'animateWithDuration that accepts the supplied arguments

Swift 3/4的更新:

// This is how I do regular animation blocks
UIView.animate(withDuration: 0.2) {
    <#code#>
}

// Or with a completion block
UIView.animate(withDuration: 0.2, animations: {
    <#code#>
}, completion: { _ in
    <#code#>
})

我没有使用尾随闭包作为完成块,因为我认为它缺乏清晰度,但如果你喜欢它,那么你可以看到Trevor's answer below

7 个答案:

答案 0 :(得分:197)

animateWithDuration中的completion参数采用一个带有一个布尔参数的块。在swift中,就像在Obj C块中一样,您必须指定闭包所需的参数:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    (value: Bool) in
    self.blurBg.hidden = true
})

这里的重要部分是(value: Bool) in。这告诉编译器这个闭包采用Bool标记的&#39;值&#39;并返回void。

作为参考,如果你想写一个返回bool的闭包,语法将是

{(value: Bool) -> bool in
    //your stuff
}

答案 1 :(得分:39)

完成正确,闭包必须接受Bool参数:(Bool) -> ()。尝试

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})

答案 2 :(得分:29)

in关键字一起单独调整会忽略输入

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.hidden = true
})

答案 3 :(得分:8)

根据上面接受的答案,上面有我的解决方案。它淡出一个视图并隐藏它几乎看不见。

func animateOut(view:UIView) {

    UIView.animateWithDuration (0.25, delay: 0.0, options: UIViewAnimationOptions.CurveLinear ,animations: {
        view.layer.opacity = 0.1
        }, completion: { _ in
            view.hidden = true
    })   
}

答案 4 :(得分:4)

在这里,这将编译

UIView.animateWithDuration(0.3, animations: {
        self.blurBg.alpha = 1
        }, completion: {(_) -> Void in
            self.blurBg.hidden = true
        })

我将Bool区域作为下划线的原因是因为您没有使用该值,如果您需要它,您可以将(_)替换为(value:Bool)

答案 5 :(得分:1)

有时你想把它放在一个变量中,根据情况以不同的方式制作动画。为此你需要

 let completionBlock : (Bool) -> () = { _ in 
 }

或者你可以使用同样详细的:

 let completionBlock = { (_:Bool) in 
 }

但无论如何,你必须在某处指明Bool

答案 6 :(得分:0)

SWIFT 3.x + 4.x

我想进行更新并简化操作。

以下示例在任何view实施,它隐藏得很慢,而且完全透明;从父view

中删除它

ok变量将始终返回动态终止的true

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }