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

Posted

技术标签:

【中文标题】如何在覆盖 UIView 之前停止幻灯片过渡到 Second VC?【英文标题】:How to stop slide transition into Second VC before it covers UIView? 【发布时间】:2016-02-09 19:58:13 【问题描述】:

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

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

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

【问题讨论】:

第二个控制器没有引用第一个控制器中的视图。相反,您应该尝试呈现一个 uiview 而不是 uiview 控制器,然后您可以轻松找出两个 uiview 是否接触。 所以你是说我应该为 UIView 创建自定义幻灯片动画以滑入屏幕?对于 ios 编程来说还是比较新的,你可能知道的任何链接都可以将我引导到一个我可以学习如何做到这一点的地方? 我认为您对如何执行此操作有错误的想法。你知道如何以模态方式呈现和关闭控制器吗? 我很可能是在处理这个错误哈哈。我不知道如何以模态方式呈现和关闭控制器。我一直在网上搜索如何完成这项任务,但不知道如何去做。 【参考方案1】:

听起来你的目标是:

    有一个基本视图 在第一个视图上向上滑动第二个视图

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

    SlidingContainerViewController。 这是一个自定义容器视图控制器,将容纳我们的其他两个视图控制器 一些后台视图控制器 一些前台视图控制器

这是自定义 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

【讨论】:

太棒了!我会尝试看看我是否可以尽快正确实施这个!浏览了 github,看到您向委托添加了代码,以及我没有看到主情节提要?还是个菜鸟,所以我不完全理解这一切,但我一定会看看我能做什么:) 您能够以编程方式执行此操作,但我也想知道这是否只是开发应用程序的一种更高级的方式,或者如果您在界面生成器中设计它然后编写代码也没有什么不同过渡?这样在 IB 中实现容器视图。通过 segue 连接它们,添加轻击手势识别器,然后添加代码以允许视图使用 performSegueWithIdentifier 滑入屏幕。 根据我的经验,大多数 iOS 开发人员都广泛使用 Interface Builder。我过去曾使用过它,但现在我完全用代码完成所有事情。对我来说,我是一名程序员,所以感觉在代码中做所有事情比在 IB 中隐藏一些设置和在代码中隐藏一些设置更合适。我在答案的底部添加了一条注释来解决这个问题。 非常感谢。我在编程、swift、C++、python 方面大约有 6 个月的时间。课堂上的 C++ 和 Python,现在在学校里我自己学得很快。你提供了很多谢谢:) 很高兴它有帮助。 iOS 开发者摇滚,坚持下去!如果你们每个人都被卡住了,请随时打我。联系信息在我的个人资料中,您可以将我指向您发布的另一个 Stack Overflow 帖子。

以上是关于如何在覆盖 UIView 之前停止幻灯片过渡到 Second VC?的主要内容,如果未能解决你的问题,请参考以下文章

UIView 幻灯片过渡,需要帮助和接近工作的代码

UIView 动画过渡卷曲与透明背景

带有视图的 UIView 过渡和设置框架不再适用于 iOS 8

如何在反应中滑动或隐藏带有过渡的div?

iOS UIView 过渡,容器视图创建问题

颤动幻灯片过渡到特定位置