如何在覆盖UIView之前停止幻灯片过渡到第二个VC?

时间:2016-02-09 19:58:13

标签: ios swift storyboard segue slide

在我的应用程序中,我在屏幕顶部有一个uiview。当我点击UIView时,我有第二个View Controller向上滑动。我想要实现的是,当第二个View Controller滑入屏幕时,它会在它掩盖UIView之前停止

我想要完成的是有一个视图向上滑动,其中包含商店信息,如营业时间,地址,电话号码等。所以我想我可以拥有另一个包含所有这些信息的视图控制器。只有一部分是我想阻止它向上滑动,所以它与顶部的uiview条齐平。

//tap to bring up the second view controller
@IBAction func showInfoVC(sender: AnyObject) {
    self.performSegueWithIdentifier("showSecondVC", sender: self)
}

1 个答案:

答案 0 :(得分:2)

听起来你的目标是:

  1. 有一个基本视图
  2. 在第一个
  3. 上向上滑动第二个视图

    假设是这种情况,有多种方法可以实现这一点,但Apple可能会推荐View Controller Containment。要做到这一点,你将拥有:

    1. A SlidingContainerViewController
      • 这是一个自定义容器视图控制器,可以容纳我们的其他两个视图控制器
    2. 某些背景视图控制器
    3. 某些前景视图控制器
    4. 以下是自定义SlidingContainerViewController的基本实现

      // SlidingContainerViewController.swift
      
      import UIKit
      
      class SlidingContainerViewController: UIViewController {
      
          //MARK: - Init
          init(frontViewController: UIViewController, backViewController: UIViewController) {
              super.init(nibName: nil, bundle: nil)
              frontViewContoller = frontViewController
              backViewContoller = backViewController
          }
      
          required init?(coder aDecoder: NSCoder) {
              fatalError("init(coder:) has not been implemented")
          }
      
          //MARK: - Public
          var frontViewContoller: UIViewController = UIViewController()
          var backViewContoller: UIViewController = UIViewController()
          var splitOriginY: CGFloat = 160.0
      
          func toggleFrontView() {
              if frontIsVisible {
                  UIView.animateWithDuration(0.4) {
                      self.frontViewContoller.view.frame.origin.y = self.view.frame.height
                      self.frontIsVisible = false
                  }
              } else {
                  UIView.animateWithDuration(0.4) {
                      self.frontViewContoller.view.frame.origin.y = self.splitOriginY
                      self.frontIsVisible = true
                  }
      
              }
          }
      
          //MARK: - ViewLifecycle
          override func viewDidLoad() {
              super.viewDidLoad()
              addChild(backViewContoller)
              addChild(frontViewContoller)
              self.frontViewContoller.view.frame.origin.y = self.view.frame.height
          }
      
          //MARK: - Private
          var frontIsVisible = false
      
          private func addChild(viewController: UIViewController) {
              addChildViewController(viewController)
              view.addSubview(viewController.view)
              viewController.view.frame = view.bounds
              viewController.didMoveToParentViewController(self)
          }
      
      }
      

      然后,您可以将所需的任何自定义视图控制器放入此容器View Controller中。底层视图控制器只需要在容器View Controller上调用toggleFrontView(),只要它想要幻灯片发生。

      下面我添加了两个示例视图控制器用于演示目的。 您可以在github上查看整个项目:SlidingVC

      SlidingContainerViewController

      *注意:此解决方案是在没有Interface Builder的情况下以编程方式实现的。我个人用这种方式完全用代码构建我的所有应用程序。如果您希望使用Interface Builder,您可以使用Storyboard和自定义segue完成相同的操作。以下是相关教程:A Beginner’s Guide to Animated Custom Segues in iOS 8