在覆盖UIView之前如何阻止幻灯片切换到第二个VC?

在我的应用程序中,我在屏幕的顶部有一个uview。 当我点击该UIView时,我有第二个视图控制器幻灯片。 我想完成的是,当第二个视图控制器滑入屏幕时,它就会在覆盖UIView之前停下来

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

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

这听起来像你的目标是:

  1. 有一个基础视图
  2. 第一次滑动第二个视图

假设情况如此,有多种方法可以完成此任务,但是Apple可能会推荐View Controller Containment 。 要做到这一点,你将有:

  1. SlidingContainerViewController
    • 这是一个自定义的容器视图控制器,将容纳我们的其他两个视图控制器
  2. 一些背景视图控制器
  3. 一些前景视图控制器

这是一个自定义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) } } 

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

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

SlidingContainerViewController

*注意:这个解决scheme在没有Interface Builder的情况下以编程方式实现 我个人以这种方式完全在代码中构build我的所有应用程序。 如果您希望使用Interface Builder,则可以使用Storyboard和自定义Segges来完成相同的操作。 这里是一个相关的教程: 在iOS 8的animation自定义段的初学者指南