Ios 在segue期间,UIView如何保持在segue动画的顶部?

Ios 在segue期间,UIView如何保持在segue动画的顶部?,ios,swift,Ios,Swift,我有一个故事板序列,在显示新视图时,我希望UIView始终位于顶部,这样序列就不会影响它。尝试设置insertSubview,但它没有从底部推送的动画。下面是我快速编写的一些代码,其中显示了两个视图控制器,一个是您要使用的,另一个是来自的。我将动画放在一个名为“buttonPressed的函数中,但是它应该去调用转换的任何函数。代码的其余部分很容易解释 为了实现这一点,两个视图控制器都需要一个具有相同名称(或不同名称但跟踪哪个是哪个)的视图,我使用了IBOutlet staticView。然后在

我有一个故事板序列,在显示新视图时,我希望UIView始终位于顶部,这样序列就不会影响它。尝试设置
insertSubview
,但它没有从底部推送的动画。

下面是我快速编写的一些代码,其中显示了两个视图控制器,一个是您要使用的,另一个是来自的。我将动画放在一个名为“buttonPressed的函数中,但是它应该去调用转换的任何函数。代码的其余部分很容易解释

为了实现这一点,两个视图控制器都需要一个具有相同名称(或不同名称但跟踪哪个是哪个)的视图,我使用了
IBOutlet staticView
。然后在InterfaceBuilder中,确保它们具有相同的约束或框架,以便在vc的静态视图上设置为另一个时,它会附着到相同的位置

class ViewControllerFrom: UIViewController {

        @IBOutlet weak var staticView: UIView!

        @IBAction func buttonPressed(_ sender: Any) {

            let toVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "toVC") as! ViewControllerTo

            //Add nextVC's view to ours as subview
            self.view.addSubview(toVC.view)

            //Set its starting height to be below current view.
            toVC.view.frame = CGRect(x: 0, y: view.frame.height, width: view.frame.width, height: view.frame.height)

            //This is important to make sure staticView stays in front of view animating in
            view.bringSubview(toFront: staticView)
            if toVC.staticView != nil {
                toVC.staticView.isHidden = true
            }
            //I use animation duration 0.4, close to default animations by iOS.
            UIView.animate(withDuration: 0.4, animations: {
                toVC.view.frame.origin.y = 0
            }, completion: { (success) in
                if success {
                    //Now that view is in place, set static view from old vc to new vc and reshow it. Then do the actual presentation unanimated.
                    toVC.staticView.isHidden = false
                    toVC.staticView = self.staticView
                    self.present(toVC, animated: false, completion: nil)
                }
            })
        }

    }

    class ViewControllerTo : UIViewController {

        @IBOutlet weak var staticView: UIView!

    }

我只能想到一种方法——假装它(或类似的东西)。因为您正在讨论两个视图控制器之间的分段,所以这些视图(及其控制器)不能是“始终保持在顶部”视图的父视图,对吗?因此,剩下的是相反的情况——让这两个视图(及其控制器)成为“始终保持在顶部”视图及其控制器的子视图。是的,在这一点上,为什么要使用segue?写你自己的动画——这就是我对伪造动画的评论。你能告诉我怎么做吗?下面是两条评论。首先,我使用故事板(或IB)只是作为segues的直接导航管道。我喜欢对视图和视图控制器进行编码。在IB中无法完成的代码中,您可以做的很少,所以这可能在IB中也可以完成。但在这方面,我帮不了什么忙。因此,让我们严格地从MVC的角度来谈,重点放在它的VC(视图和控制器)部分。视图可以有子视图,视图控制器可以有子视图控制器,对吗?这里是重要的一点-一个子视图或子视图控制器只能有一个父视图…因此,在布置视图层次时,无论您如何从一个视图/屏幕到另一个视图/屏幕进行动画制作,我只能想到一种方法使视图位于该动画的顶部(#顶部)-如果这些视图(#之前和#之后)在某种程度上是顶部的子视图。现在每个视图可能都有自己的控制器,但这实际上取决于每个视图需要做什么。最简单的设置是只有一个控制器,所以让我们从这个开始。如果你有一个两级的层次结构(带子对象的顶部、前面和后面),你可以删除这个片段——毕竟它只是一个动画。事实上,在故事板之前,你就是这么做的。我理解,但我不知道如何制作动画,也没有使用过自定义动画:(非常感谢!事实上,我对您的代码做了一点改进,使得
staticView
只出现在第一个视图中:制作一个精确的副本,使用
insertSubview
索引为3,然后在索引为2处插入
toVc.view
。再次感谢!是的,您肯定不需要
st的变量aticView
,但万一您稍后在“toVC”的实现中引用,将同一个实例从一个VC传递到下一个VC很好。