【问题标题】:Understanding the value of UIViewController transitions理解 UIViewController 转换的价值
【发布时间】:2016-07-27 22:01:04
【问题描述】:

我正在尝试学习一些新的 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 中的值是否主要用于交互式过渡?

感谢澄清

【问题讨论】:

    标签: ios swift uiviewcontroller uiviewanimationtransition


    【解决方案1】:

    我认为新的转换 API(UIViewControllerTransitioningDelegate 和朋友们)只是控制器之间视图转换泛化的最后一步。

    在 UIKit 的第一个版本中,我们必须 hack the system transition code 才能获得任何自定义转换。多年后,我们得到了控制器遏制,这使得将视图控制器作为一等公民和create our own interactive transitions 管理成为可能。最后一步是拥有一个功能齐全的通用系统 API,可用于您梦寐以求的任何转换——这就是新的转换 API。

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

    【讨论】:

    • 我同意其中涉及许多单独的类,乍一看 API 看起来令人生畏。但是,Apple 的文档涵盖了所有的基础,并且您必须为每个类编写(例如)复制 UIAlertController 的行为的代码量并不多。
    【解决方案2】:

    新的过渡 API 将如何改进这一点?

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

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

    可重用性:在此之后您会做什么?毫无疑问,设置从过渡到控制器的过渡。而且有可能是这部动画的反转吗?很有可能。因此,您可能会将此代码复制并粘贴到该控制器并在那里反转它。现在你有两个副本。使用转换的一份副本将更易于维护。 (还要注意自定义转换 pod 的存在,因为可重用性和可共享性齐头并进。)

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

    因此,对于您打算多次查看的任何代码,转换 API 可能值得付出努力!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2018-04-12
      • 2014-10-10
      • 1970-01-01
      • 2021-11-08
      • 2017-05-06
      相关资源
      最近更新 更多