我有一个动画,当它完成时我想从它的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
的参数,但是在线阅读了很多文章后,我仍然无法做到这一点。
谢谢!
答案 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()})