Ios 了解UIViewController转换的价值

Ios 了解UIViewController转换的价值,ios,swift,uiviewcontroller,uiviewanimationtransition,Ios,Swift,Uiviewcontroller,Uiviewanimationtransition,我正在尝试学习一些新的iOS编程模式。我读过很多关于iOS 7中添加的UIViewController转换API的文章。他们看起来很酷,但对于一项看似简单的任务,他们也会感到相当沉重 考虑这个用例: 我有一个自定义的容器视图控制器来管理“幻灯片”。它包含一组幻灯片视图控制器,用户可以通过点击按钮来前后移动 我可以按如下方式实现此转换: private func transitionToViewController(viewController: UIViewController, directi

我正在尝试学习一些新的iOS编程模式。我读过很多关于iOS 7中添加的UIViewController转换API的文章。他们看起来很酷,但对于一项看似简单的任务,他们也会感到相当沉重

考虑这个用例: 我有一个自定义的容器视图控制器来管理“幻灯片”。它包含一组幻灯片视图控制器,用户可以通过点击按钮来前后移动

我可以按如下方式实现此转换:

private func transitionToViewController(viewController: UIViewController, direction: TransitionDirection = .Forward, animated: Bool = true) {
    currentViewController.willMove(toParentViewController: nil)
    addChildViewController(viewController)
    // ... set up frames, other animation prep ...
    contentContainerView.addSubview(comingView)
    UIView.animate(duration: 0.5, animations: { 
        // do the animations
    }) { (finished) in
        leavingView.removeFromSuperview()
        self.currentViewController.removeFromParentViewController()
        viewController.didMove(toParentViewController: self)
        // final clean up
    } 
}
更新的转换API将如何改进这一点?据我所知,如果您使用自己的容器视图控制器,这些API的使用就更加复杂(请参阅

转换API中的值主要用于交互式转换吗


感谢您澄清

我认为新的转换API(
UIViewControllerTransitioningDelegate
和friends)只是控制器之间视图转换通用化的最后一步

在UIKit的第一个版本中,我们必须获得任何自定义转换。几年后,我们获得了控制器控制,这使我们能够将视图控制器作为一级公民和用户进行管理。最后一步是为您梦想的任何转换提供一个功能齐全的通用系统API–这就是新的转换API

新的API使将转换提取到独立类成为可能。这反过来又使我们最终可以从GitHub下载一个转换库,并将其作为一个简单的转换委托插入到现有代码中。无需从某个特定的超类派生视图控制器,无需使用第三方控制器容器,无需向UIKit类添加扩展。现在,转换也最终成为UIKit中的头等公民

更新的转换API将如何改进这一点

TL;DR通过封装、可重用性和可测试性实现可维护性

封装:注释表明有设置逻辑和状态来跟踪动画。您的视图控制器可能已经足够大了;将转换逻辑放在其他地方会使每个片段更小,因此更易于维护

可重用性:之后你下一步要做什么?毫无疑问,设置从转换到控制器的转换。这很可能是此动画的反转吗?很可能。因此,你将复制并粘贴此代码到该控制器,然后在那里反转。现在你有两个副本。一个副本使用e转换将更易于维护(还请注意定制转换的pod的存在,因为可重用性和可共享性是相辅相成的。)

可测试性:嵌入重量级视图控制器的代码众所周知很难测试。自定义转换可以单独测试,而不需要实时视图的状态开销


因此,对于任何您打算不止一次查看的代码,转换API可能是值得的!

我同意其中涉及到许多独立的类,乍一看,API看起来令人望而生畏。然而,苹果的文档涵盖了您必须为每个类编写的所有基础和代码量(比如)复制
UIAlertController
的行为不太常见。