ios - 增加 dismissViewControllerAnimated() 的持续时间

标签 ios swift uiviewcontroller

我一直在尝试找出如何增加 dismissViewControllerAnimated(true, completion: nil) 的持续时间,但似乎无法在 Apples documentation 中找到答案.我的 View Controller 从下到上显示动画,并在关闭时以相反的顺序运行。我想让动画慢一点,比如 0.5 秒,有什么建议吗?

最佳答案

您必须为 View Controller 使用自定义转换。请看一下这个精彩的教程来帮助您入门:http://www.appcoda.com/custom-view-controller-transitions-tutorial/

在此处添加主要代码,以防将来链接被删除:

创建一个名为 CustomPresentAnimationController 的新类,并使其成为 NSObject 的子类。 类 CustomPresentAnimationController: NSObject, UIViewControllerAnimatedTransitioning

UIViewControllerAnimatedTransitioning 协议(protocol)有两个必需的方法,我们接下来将添加它们。将以下方法添加到类中。

    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
    })}

动画 Controller 完成后,我们需要将其链接到 Storyboard转场。 打开 ItemsTableViewController.swift 文件并更改类声明,如下所示。

class ItemsTableViewController: UITableViewController, UIViewControllerTransitioningDelegate {

将其添加到此类中以处理转场:

let customPresentAnimationController = CustomPresentAnimationController()

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "showAction" {
        let toViewController = segue.destinationViewController as UIViewController
        toViewController.transitioningDelegate = self
    }
}

将以下UIViewControllerTransitioningDelegate方法添加到类中。这将返回我们的自定义动画 Controller 的实例。

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return customPresentAnimationController
}

所有内容均归文章原作者所有。

关于ios - 增加 dismissViewControllerAnimated() 的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103324/

相关文章:

ios - 如何实现velocityInView : for a custom gesture recognizer?

ios - 上传图片时出错

ios - Swift:更改 ViewController 时:前一个不会消失

objective-c - iOS 5 和 UIViewController presentViewController - 现在是否可以在不破解的情况下更改模态 Controller 的大小?

ios - 是否可以从 View 的 NIB 设置 navigationitem.title?

iOS 如何从数组 Swift 中获取超过 100 个值

ios - 单元格在 iphone X 中无法正确显示

swift - 为什么我可以使用继承协议(protocol)的结构来设置协议(protocol)的只读属性?

ios - 我如何在 VIMVideoPlayer URL restricted 中播放 vimeo 视频

ios - 更改containerView swift中的可见 View Controller