繁体   English   中英

从导航控制器到视图控制器的Swift自定义展开Segue

[英]Swift custom unwind Segue from Navigation controller to View Controller

我有2个控制器:

  • 第一视图控制器(1)
  • 嵌入在导航控制器(2a)中的第二视图控制器(2)

(1)->(2a-2)

与VC之间的自定义Segue导航:

  • 正常的CustomSegue。 从1到2
  • 展开CustomUnwindSegue。 从2到1

当我使用常规segue时:第二个控制器(包括导航栏!!!)从右侧推第一个控制器

当我使用放松顺序时:第一个控制器向右推第二个控制器(没有导航栏!!!!! 导航栏很粘! 导航完成后,栏消失。

如何通过导航栏推送View Controller。

我的代码:

class CustomSegue: UIStoryboardSegue {

    override func perform() {

        let toViewController: UIViewController = self.destinationViewController as! UIViewController
        let fromViewController: UIViewController = self.sourceViewController as! UIViewController

        let containerView: UIView? = fromViewController.view.superview
        let screenBounds: CGRect = UIScreen.mainScreen().bounds

        let finalToFrame: CGRect = screenBounds
        let finalFromFrame: CGRect = CGRectOffset(finalToFrame, -screenBounds.size.width, 0)

        toViewController.view.frame = CGRectOffset(finalToFrame, screenBounds.size.width, 0)
        containerView?.addSubview(toViewController.view)

        UIView.animateWithDuration(0.5, animations: {

            toViewController.view.frame = finalToFrame
            fromViewController.view.frame = finalFromFrame

            }, completion: { finished in
                let fromVC: UIViewController = self.sourceViewController as! UIViewController
                let toVC: UIViewController = self.destinationViewController as! UIViewController
                fromVC.presentViewController(toVC, animated: false, completion: nil)
        })
    }
}

class CustomUnwindSegue: UIStoryboardSegue {

    override func perform() {

        let toViewController: UIViewController = self.destinationViewController as! UIViewController
        let fromViewController: UIViewController = self.sourceViewController as! UIViewController

        let containerView: UIView? = fromViewController.view.superview
        let screenBounds: CGRect = UIScreen.mainScreen().bounds

        let finalToFrame: CGRect = screenBounds
        let finalFromFrame: CGRect = CGRectOffset(finalToFrame, screenBounds.size.width, 0)

        toViewController.view.frame = CGRectOffset(finalToFrame, -screenBounds.size.width, 0)
        containerView?.addSubview(toViewController.view)

       UIView.animateWithDuration(0.5, animations: {

            toViewController.view.frame = finalToFrame
            fromViewController.view.frame = finalFromFrame

            }, completion: { finished in
                let fromVC: UIViewController = self.sourceViewController as! UIViewController
                let toVC: UIViewController = self.destinationViewController as! UIViewController
                fromVC.dismissViewControllerAnimated(false, completion: nil)
        })
    }
}

在正向序列中,您是从VC1动画到VC2a,这将是序列的目的地。 对VC2a进行动画处理也会使VC2出现,因为VC2a将其显示为视图的一部分。 因此,UINavigationBar和VC2都可以插入。

在反向序列中,您是从VC2动画到VC1。 VC2的view无法覆盖整个屏幕,因为UINavigationBar占据了其中的一部分。 您可以对VC2的视图进行动画处理,并将其替换为VC1,完成后,您可以dismissViewControllerAnimated ,这会使VC2a消失而没有动画。

无需在反向序列中为VC2的视图设置动画,而是需要再次为VC2a的视图设置动画。 这应该随带VC2。 我没有尝试过这段代码,但是像这样:

   UIView.animateWithDuration(0.5, animations: {
        toViewController.view.frame = finalToFrame
        VC2a.view.frame = finalFromFrame
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM