Swift上的块(animateWithDuration:animations:completion :)


102

我在使块在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的答案


1
“自动完成为我提供了完成:((Bool)-> Void)?但不确定如何使它起作用”,它的内容恰如其分。这必须是一个带布尔值并返回空值的块。
马特2014年

你怎么知道((Bool)-> Void)?是为了?由于我在ObjC中已经使用过此功能,所以我知道它已经完成了。但是快速的编码员怎么知道?
malhal 2014年

Answers:


202

animateWithDuration中的完成参数采用一个块,该块采用一个布尔参数。像在Obj C块中一样,必须迅速指定闭包采用的参数:

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

这里的重要部分是(value: Bool) in。这告诉编译器,此闭包采用标有“值”的Bool并返回void。

作为参考,如果您想编写一个返回布尔值的闭包,则语法为

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

也可以通过使用$0第一个参数来解决,只需使用块中的变量,编译器就会发现您的块接受了一个参数。
2015年

1
dat完成块语法:(
Chris Allinson

41

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

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

2
值得注意的是,这个版本正确的。由于可以推断出完整类型,因此您无需写出完整类型,因此您只需要提及此处提到的闭包参数即可。
2014年

29

下划线本身 in关键字将忽略输入

迅捷2

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

斯威夫特3,4,5

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.isHidden = true
})

8

以上是我的解决方案,它是基于上面接受的答案。它会淡化视图,并在几乎不可见时将其隐藏。

迅捷2

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

斯威夫特3,4,5

func animateOut(view: UIView) {

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveLinear ,animations: {
        view.layer.opacity = 0.1
    }, completion: { _ in
        view.isHidden = true
    })
}

4

在这里,这将编译

迅捷2

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

斯威夫特3,4,5

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

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


1

有时,您需要将此变量放入变量中以根据情况以不同的方式进行动画处理。为此,您需要

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

或者,您可以使用同样冗长的内容:

 let completionBlock = { (_:Bool) in 
 }

但是无论如何,您都必须指出Bool某个地方。


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()
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.