【问题标题】:Swift custom unwind Segue from Navigation controller to View Controller从导航控制器到视图控制器的 Swift 自定义展开 Segue
【发布时间】:2015-06-22 11:22:47
【问题描述】:

我有 2 个控制器:

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

( 1 ) -> ( 2a - 2 )

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

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

当我使用正常的转场时: 第二个控制器(包括导航栏!!!)从右侧推送第一个控制器

当我使用 unwind segue 时: 第一个控制器将第二个控制器(没有导航栏!!!仅在导航控制器内查看)推到右侧。导航栏很粘!当导航完成栏消失。

如何使用导航栏推送视图控制器。

我的代码:

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)
        })
    }
}

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller uinavigationbar


    【解决方案1】:

    在前向转场中,您正在从 VC1 动画到 VC2a,这将是转场的目的地。在 VC2a 中设置动画也会使 VC2 出现,因为 VC2a 将其作为其视图的一部分呈现。所以 UINavigationBar 和 VC2 都滑进去了。

    在反向转场中,您正在从 VC2 动画到 VC1。 VC2的view并没有覆盖整个屏幕,因为有些被UINavigationBar占用了。您将 VC2 的视图设置为动画并将其替换为 VC1,完成后,您 dismissViewControllerAnimated 会导致 VC2a 消失而没有动画。

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多