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

时间:2015-03-27 19:26:37

标签: 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??*/)

我想将self.removeFromSuperView()称为completion的参数,但是在线阅读了很多文章后,我仍然无法做到这一点。

谢谢!

4 个答案:

答案 0 :(得分: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()
    })

完成闭包有一个参数,一个Bool(在上面的代码中称为finished),表示动画是否实际完成或被中断。

值得考虑的是,由于您在完成闭包中引用self,因此可能 *动画可能会影响视图的生命周期(请考虑否则将取消分配视图时动画仍在运行,但是闭包的强引用是使视图保持活动状态。出于这个原因,我添加了一个捕获列表,以确保使用self的弱引用。

*可能,但可能不太可能......视图应仅在响应从视图层次结构中删除时被释放,我希望无论如何都会隐式取消动画并使用{{1来调用完成闭包}}。但是,我个人在谨慎方面犯了错误,反正包括finished == false,因为我是偏执狂。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

UIView.animateWithDuration(0.5,
        delay: 0.0,
        options: .CurveEaseInOut,
        animations: { self.frame = CGRectMake(0,0, 500, 500)},
        completion: { _ in self.removeFromSuperview() })

答案 3 :(得分:0)

UIView.animateWithDuration(0.5,         延迟:0.1,         选项:.CurveEaseInOut,         动画:      {self.frame = CGRectMake(0,0,500,500)},         完成:{_ in self.removeFromSuperview()})