Ios 编写UIView动画函数,在特定时间为视图制作动画
如何通过发送函数视图、动画次数、应用的动作函数和成功函数,将代码重构为更紧凑的 如果能提出函数式编程解决方案,这将是有帮助的Ios 编写UIView动画函数,在特定时间为视图制作动画,ios,swift,uiview,uiviewanimation,Ios,Swift,Uiview,Uiviewanimation,如何通过发送函数视图、动画次数、应用的动作函数和成功函数,将代码重构为更紧凑的 如果能提出函数式编程解决方案,这将是有帮助的 typealias AnimateAction = UIView -> Void typealias AnimateSuccess = Bool -> Void func animateThreetimes(animatedView:UIView,animateAction:AnimateAction,animateSuccess:AnimateSucces
typealias AnimateAction = UIView -> Void
typealias AnimateSuccess = Bool -> Void
func animateThreetimes(animatedView:UIView,animateAction:AnimateAction,animateSuccess:AnimateSuccess)
{
UIView.animateWithDuration(0.5, animations: { () -> Void in
animateAction(animatedView)
}) { (success) -> Void in
UIView.animateWithDuration(1, animations: { () -> Void in
animateAction(animatedView)
}, completion: { (success) -> Void in
UIView.animateWithDuration(0.5, animations: { () -> Void in
animateAction(animatedView)
}, completion: { (success) -> Void in
animateSuccess(success)
})
})
}
}
递归会做得很好:
func animate(count: Int) {
if count > 0 {
UIView.animateWithDuration(0.2, animations: { () -> Void in
// do the animations
}, completion: { (_) -> Void in
self.animate(count-1);
})
}
}
您也可以这样做,以便对传入的变量以及希望如何处理完成进行更多的控制。此外,这满足了您对问题功能解决方案的要求
typealias AnimationAction = UIView -> Void
typealias AnimationSuccess = Bool -> Void
func animateView(view: UIView, animationAction: AnimationAction) -> (duration: NSTimeInterval, completionHandler: AnimationSuccess?) -> Void {
// Return a function that takes a duration and a maybe completion handler
return { duration, completionHandler in
return UIView.animateWithDuration(duration, animations: {
animationAction(view)
}, completion: { finished in
completionHandler?(finished) // Optional function only called if exists
})
}
}
// Just showing the mechanism
let durations = [0.5, 1, 0.5]
for index in 0..<durations.count {
let view = UIView(frame: CGRectZero)
let animationAction: AnimationAction = { view in
print("View: \(view)")
}
let completionHandler: AnimationSuccess? = {
if durations[index] == durations.last {
return { finished in
print(finished)
}
} else {
return nil
}
}()
animateView(view, animationAction: animationAction)(duration: durations[index], completionHandler: completionHandler)
}
typealias AnimationAction=UIView->Void
typealias AnimationSuccess=Bool->Void
func animateView(视图:UIView,animationAction:animationAction)->(持续时间:NSTimeInterval,完成处理程序:AnimationSuccess?->Void{
//返回一个具有持续时间和可能的完成处理程序的函数
返回{持续时间,中的completionHandler
返回UIView.animateWithDuration(持续时间,动画:{
动画动作(视图)
},完成:{在中完成
completionHandler?(finished)//仅在存在时调用可选函数
})
}
}
//只是展示一下机制
让持续时间=[0.5,1,0.5]
对于0..中的索引,假设您需要一种可用于任意数量动画的通用方法
您可以在函数调用中包含一个计数器变量,在设置动画后将其递减,当它为非零时,再次调用动画函数您没有问过问题我编辑了一个问题,谢谢,就像我键入此问题时其他人所说的那样