如何在没有 Storyboards/Unwindng Segues 的情况下在 Swift 中使用 UIViewControllerAnimatedTransitioning?

Posted

技术标签:

【中文标题】如何在没有 Storyboards/Unwindng Segues 的情况下在 Swift 中使用 UIViewControllerAnimatedTransitioning?【英文标题】:How to use UIViewControllerAnimatedTransitioning in Swift without Storyboards / Unwindng Segues? 【发布时间】:2015-01-22 23:16:19 【问题描述】:

我在 Swift 中创建自定义视图控制器转换时遇到了一点问题。我找到了这个出色的教程http://mathewsanders.com/interactive-transitions-in-swift/,但我无法弄清楚如何在没有情节提要的情况下创建过渡(我正在开发的应用程序不使用界面构建器或情节提要)。


所需结果的 GIF

http://mathewsanders.com/assets/transitions-3/Menu-3.gif


具体来说,我遇到的麻烦在于使用 segues 的部分:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 

let menu = segue.destinationViewController as MenuViewController
menu.transitioningDelegate = self.transitionManager



@IBAction func unwindToMainViewController (sender: UIStoryboardSegue)
    // bug? exit segue doesn't dismiss so we do it manually... 
    self.dismissViewControllerAnimated(true, completion: nil)

 

如果你想放弃 segue 和 Storyboard 路线,你如何创建这样的过渡?

我的目标是使用平移手势向下滑动 UICollectionView 详细视图以关闭(类似于 Facebook 照片如何关闭它/关闭视图控制器,我知道 Facebook 为此使用滚动视图,但我需要使用 UICollectionView 和UIViewController 充当单元格的详细视图)。

【问题讨论】:

如果您不使用 segue,您只需实例化您的控制器,然后将其推送或呈现在代码中。这基本上就是 segue 正在做的事情。 【参考方案1】:

因此,您需要将代码放入平移手势识别器的事件处理程序中。当手势识别器的状态变为 UIGestureRecognizerStateBegan 时,您需要使用 UIViewController 的 presentViewController:animated: 方法开始转换。

class MyViewController: UIViewController 
    var transitionPercentage: CGFloat = 0.0

    func handlePanGestureRecognizer(gestureRecognizer: UIPanGestureRecognizer) 
        let gestureTranslationX: CGFloat = gestureRecognizer.translationInView(view).x
        switch gestureRecognizer.state 
            case .Began: 
                let menuViewController: MenuViewController = MenuViewController()
                menuViewController.transitioningDelegate = self.interactiveTransitionManager;
                presentViewController(menuViewController, animated: true, completion: nil)
            
            case .Changed: 
                //Here you are going to want to figure out the percentage of your interactive transition. Feed it a threshold of how far you want the finger to move before finishing the transition, and then calculate a percentage for it using our gestureTranslationX variable above.
                transitionPercentage: CGFloat = gestureTranslationX / thresholdValue; //threshold value should be something like self.view.frame.size.width. Our percentage should be no less than 0.0 and no greater than 0.999999. You should probably have logic that prevents this value from violating either one.
                interactiveTransitionManager.updateInteractiveTransition(transitionPercentage) //transitionPercentage is whatever CGFloat variable you use to track the pan state from 0.0 to 1.0
            
            case .Cancelled, .Ended: 
                //Here you can put logic that uses the transitionPercentage to figure out whether to complete the transition or cancel it.
                if transitionPercentage >= 0.5 
                    transitionManager.finishInteractiveTransition()
                 else 
                    transitionManager.cancelInteractiveTransition()
                
            
        
    

因此,我假设您已按照问题中提到的博客文章中所述为交互式过渡设置了所有其他内容,但是如果您还有其他问题或需要更多代码,请不要犹豫,在我的回答中发表评论。

【讨论】:

现在把这个想法整合进去,会让你知道结果如何,乍一看就像是答案。 赫克托,它可能有助于获得更多帮助。我尝试将您的解决方案与教程代码结合起来,但存在大量错误。

以上是关于如何在没有 Storyboards/Unwindng Segues 的情况下在 Swift 中使用 UIViewControllerAnimatedTransitioning?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在没有订单的情况下填充托盘架存储?

如何在没有没有索引的 url 的情况下调用 codeigniter 控制器功能

如何在没有 UITableViewController 的情况下结束 UIRefreshControl

如何在没有 GPU 的情况下运行 tensorflow?

如何在没有'id'列的MySql中获取最后插入的记录?

如何在没有 iMessage 的情况下发送短信