我一直在尝试找出如何增加dismissViewControllerAnimated(true, completion: nil)
的持续时间,但似乎无法在Apples documentation中找到答案。我的视图控制器从下到上以动画形式出现,并在关闭时以相反的顺序运行。我希望动画慢一点,例如0.5秒,有什么建议吗?
最佳答案
您将必须为视图控制器使用自定义过渡。请查看这个精彩的教程,以帮助您入门:http://www.appcoda.com/custom-view-controller-transitions-tutorial/
在这里添加主要代码,以防将来链接被删除:
创建一个名为CustomPresentAnimationController
的新类,并将其作为NSObject
的子类。
类CustomPresentAnimationController:NSObject,UIViewControllerAnimatedTransitioningUIViewControllerAnimatedTransitioning
协议有两个必需的方法,我们接下来将添加它们。将以下方法添加到该类。
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 2.5
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController)
let containerView = transitionContext.containerView()
let bounds = UIScreen.mainScreen().bounds
toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
containerView.addSubview(toViewController.view)
UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: {
fromViewController.view.alpha = 0.5
toViewController.view.frame = finalFrameForVC
}, completion: {
finished in
transitionContext.completeTransition(true)
fromViewController.view.alpha = 1.0
})}
动画控制器完成后,我们需要将其链接到情节提要segue。
打开
ItemsTableViewController.swift
文件并更改类声明,如图所示。class ItemsTableViewController: UITableViewController, UIViewControllerTransitioningDelegate {
将此添加到此类中以处理segue:
let customPresentAnimationController = CustomPresentAnimationController()
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showAction" {
let toViewController = segue.destinationViewController as UIViewController
toViewController.transitioningDelegate = self
}
}
将以下
UIViewControllerTransitioningDelegate
方法添加到该类。这将返回我们的自定义动画控制器的实例。func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return customPresentAnimationController
}
全部归功于文章的原始作者。