如何在覆盖 UIView 之前停止幻灯片过渡到 Second VC?
How to stop slide transition into Second VC before it covers UIView?
在我的应用程序中,我在屏幕顶部有一个 uiview。当我点击那个 UIView 时,我有第二个 View Controller 向上滑动。我想要完成的是,当第二个视图控制器滑入屏幕时,它会在覆盖 UIView
之前停止
我想要完成的是有一个向上滑动的视图,其中包含商店信息,例如营业时间、地址、phone 号码等。所以我想我可以有另一个视图控制器所有这些信息。只有一部分是我想阻止它向上滑动,所以它与顶部的 uiview 栏齐平。
//tap to bring up the second view controller
@IBAction func showInfoVC(sender: AnyObject) {
self.performSegueWithIdentifier("showSecondVC", sender: self)
}
听起来您的目标是:
- 有基本视图
- 在第一个视图上向上滑动第二个视图
假设是这种情况,您可以通过多种方式完成此操作,但 Apple 可能会推荐 View Controller Containment。为此,您将拥有:
- 一个
SlidingContainerViewController
。
- 这是一个自定义容器 View Controller,它将容纳我们的其他两个 View Controller
- 一些后台视图控制器
- 一些前台视图控制器
这是自定义 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
*注意:此解决方案是在没有 Interface Builder 的情况下以编程方式实现的。我个人以这种方式完全用代码构建我所有的应用程序。如果你想使用 Interface Builder,你可以使用 Storyboard 和自定义 segues 来完成同样的事情。这里有一个相关的教程:A Beginner’s Guide to Animated Custom Segues in iOS 8
在我的应用程序中,我在屏幕顶部有一个 uiview。当我点击那个 UIView 时,我有第二个 View Controller 向上滑动。我想要完成的是,当第二个视图控制器滑入屏幕时,它会在覆盖 UIView
之前停止我想要完成的是有一个向上滑动的视图,其中包含商店信息,例如营业时间、地址、phone 号码等。所以我想我可以有另一个视图控制器所有这些信息。只有一部分是我想阻止它向上滑动,所以它与顶部的 uiview 栏齐平。
//tap to bring up the second view controller
@IBAction func showInfoVC(sender: AnyObject) {
self.performSegueWithIdentifier("showSecondVC", sender: self)
}
听起来您的目标是:
- 有基本视图
- 在第一个视图上向上滑动第二个视图
假设是这种情况,您可以通过多种方式完成此操作,但 Apple 可能会推荐 View Controller Containment。为此,您将拥有:
- 一个
SlidingContainerViewController
。- 这是一个自定义容器 View Controller,它将容纳我们的其他两个 View Controller
- 一些后台视图控制器
- 一些前台视图控制器
这是自定义 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
*注意:此解决方案是在没有 Interface Builder 的情况下以编程方式实现的。我个人以这种方式完全用代码构建我所有的应用程序。如果你想使用 Interface Builder,你可以使用 Storyboard 和自定义 segues 来完成同样的事情。这里有一个相关的教程:A Beginner’s Guide to Animated Custom Segues in iOS 8