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..中的索引,假设您需要一种可用于任意数量动画的通用方法


您可以在函数调用中包含一个计数器变量,在设置动画后将其递减,当它为非零时,再次调用动画函数

您没有问过问题我编辑了一个问题,谢谢,就像我键入此问题时其他人所说的那样