如何用动画在Swift中编写完成处理程序.

Ste*_*Fox 0 ios swift

我有一个动画,当它完成时我想从它的superView中删除它.但是,我无法理解Swift的完成处理程序语法.此动画是在UIView子类中编写的.

UIView.animateWithDuration(0.5,
        delay: 0.0,
        options: .CurveEaseInOut,
        animations: { self.frame = CGRectMake(0,0, 500, 500)},
        completion: /*Magic Code here??*/)
Run Code Online (Sandbox Code Playgroud)

我想把它self.removeFromSuperView()作为参数调用completion,但是在线阅读了很多文章之后我还是无法实现这一点.

谢谢!

Sam*_*Sam 5

UIView.animateWithDuration(0.5,
    delay: 0.0,
    options: .CurveEaseInOut,
    animations: { self.frame = CGRectMake(0,0, 500, 500)},
    completion: { complete in
        self.removeFromSuperview()
    })
Run Code Online (Sandbox Code Playgroud)


Stu*_*art 5

UIView.animate(
    withDuration: 0.5,
    delay: 0.0,
    options: .curveEaseInOut,
    animations: { self.frame = CGRect(x: 0, y: 0, width: 500, height: 500) },
    completion: { [weak self] finished in
        self?.removeFromSuperview()
    })
Run Code Online (Sandbox Code Playgroud)

完成闭包需要一个参数a Bool(finished在上面的代码中调用),指示动画是否实际完成或被中断.

值得考虑的是,由于您self在完成闭包中引用,因此可能*动画可能会影响视图的生命周期(考虑到视图否则将被释放时动画仍在运行,但是闭包的强引用仍在保持观点活着).出于这个原因,我包含了一个捕获列表,以确保使用弱引用self.

*可能,但可能不太可能......视图应仅在响应从视图层次结构中删除时被释放,我希望无论如何都会隐式取消动画并调用完成闭包finished == false.但是,[weak self]无论如何,我个人都会谨慎行事,因为我是偏执狂.