繁体   English   中英

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

[英]Blocks on Swift (animateWithDuration:animations:completion:)

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

animateWithDuration的完成参数采用一个带有一个布尔参数的块。 在 Swift 中,就像在 Obj-C 块中一样,您必须指定闭包采用的参数:

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

这里的重要部分是(value: Bool) in . 这告诉编译器这个闭包接受一个标记为“值”的 Bool 并返回 Void。

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

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

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

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

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

基于上面接受的答案,上面有我的解决方案。 它淡出一个视图并将它隐藏起来,一旦几乎不可见。

斯威夫特 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
    })
}

给你,这将编译

斯威夫特 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)

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

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

或者你可以使用同样冗长的:

 let completionBlock = { (_:Bool) in 
 }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM