我正在尝试学习一些新的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使用起来会更加复杂(请参阅custom-container view controller transitions。
转换API中的值主要用于交互式转换吗?
感谢您澄清
答案 0 :(得分:7)
我认为新的转换API(UIViewControllerTransitioningDelegate
和朋友)只是控制器之间视图转换概括的最后一步。
在UIKit的第一个版本中,我们必须hack the system transition code才能获得任何自定义转换。多年以后,我们获得了控制器控制功能,可以将视图控制器作为一等公民和create our own interactive transitions进行管理。最后一步是为您可以实现的任何转换提供功能齐全的通用系统API - 这是新的转换API。
新的API可以将转换提取到独立的类中。反过来,这使得最终可以从GitHub下载转换库并将其作为简单的转换委托插入到现有代码中。无需从某个特定的超类派生您的视图控制器,无需使用第三方控制器容器,无需向UIKit类添加扩展。现在,转型终于成为了UIKit的一等公民。
答案 1 :(得分:2)
较新的转换API如何改善这一点?
TL; DR 通过封装,可重用性,可测试性维护。
封装:这些评论表明设置和状态跟踪动画的逻辑。你的视图控制器可能已经足够大了;将转换逻辑放在其他地方会使每个部分变得更小,因此更易于维护。
可重用性:在此之后您接下来要做的事情是什么?毫无疑问,设置从过渡到控制器的过渡。它可能是这个动画的逆转吗?很有可能。因此,您可以将此代码复制并粘贴到该控制器并在那里将其反转。现在你有两份副本。使用转换的一个副本将更易于维护。 (还要注意自定义转换的pod的存在,因为可重用性和可共享性是齐头并进的。)
可测试性:重量级视图控制器中嵌入的代码非常难以测试。可以单独测试自定义转换,而无需实时视图的状态开销。
因此,对于您打算不止一次查看的任何代码,转换API可能是值得的!