斯威夫特上(块animateWithDuration:动画:完成:)

问题描述 投票:100回答:7

我无法使块上斯威夫特工作。下面是工作(没有完成块)的例子:

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

更新夫特四分之三:

// 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

ios swift closures
7个回答
199
投票

在animateWithDuration完成参数取块这需要一个布尔参数。在迅速,像的OBJ C语言块,你必须指定一个封闭取参数:

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

这里最重要的部分是(value: Bool) in。这告诉这个闭合需要一个布尔标有“价值”,并返回void编译器。

作为参考,如果你想写返回布尔语法将封闭

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

39
投票

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

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

29
投票

本身强调旁边的in关键字会忽略输入

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

8
投票

还有就是我基于上述接受的答案上述溶液。它淡出视图和hiddes一次几乎看不见。

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

我之所以作出的布尔区下划线是因为你不使用该值,如果你需要它,你可以更换(_)与(价值:布尔)


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()
    }
© www.soinside.com 2019 - 2024. All rights reserved.