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

标签 ios swift storyboard segue slide

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

我想要完成的是有一个 View 向上滑动,其中包含商店信息,例如营业时间、地址、电话号码等。所以我想我可以有另一个 View Controller 来保存所有这些信息。只有一部分是我想阻止它向上滑动,以便它与顶部的 uiview 栏齐平。

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

最佳答案

听起来你的目标是:

  1. 有一个基本 View
  2. 将第二个 View 向上滑动到第一个 View

假设是这种情况,您可以通过多种方式完成此操作,但 Apple 可能会推荐 View Controller Containment .为此,您将拥有:

  1. SlidingContainerViewController
    • 这是一个自定义容器 View Controller,它将容纳我们的其他两个 View Controller
  2. 一些背景 View Controller
  3. 一些前台 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)
    }

}

然后您可以将任何您想要的自定义 View Controller 放入此容器 View Controller 中。底部 View Controller 只需在容器 View Controller 上调用 toggleFrontView() 就可以了。

为了演示目的,我在下面添加了两个示例 View Controller 。 你可以在github上查看整个项目:SlidingVC

SlidingContainerViewController

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

关于ios - 如何在覆盖 UIView 之前停止幻灯片过渡到第二个 VC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301059/

相关文章:

iphone - 背景图像/导航栏图像 iOS 的正确尺寸

arrays - 从值字典中获取数组

iphone - iOS:查找具有相同标签的所有控件

ios - 将 UI 手势识别器添加到从 .xib 实例化的 UIView

ios - iOS 中使用 Twitter API 的简单 GET 请求

ios - 在没有自动布局的情况下调整 UITableView 标题的大小

swift - nil 与预期的参数类型 '() -> Void' 不兼容

ios - iPad 专业版。禁用原生 2732×2048 分辨率

android - 跨平台程序获取 iOS 应用程序到 android/google play 商店?

ios - 停止键盘关闭以重置 View 的高度