黑屏出现在显示的视图控制器下方

时间:2018-09-15 14:55:52

标签: ios iphone swift delegates

我试图以模态呈现视图控制器。它就像一个弹出视图控制器。

我正在使用animateTransition方法为过渡设置动画。 这是我的代码:

extension PopUpViewController: UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.25
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        guard let fromVC = transitionContext.viewController(forKey: .from) else { return}
        guard let toVC = transitionContext.viewController(forKey: .to) else { return}
        guard let fromView = transitionContext.view(forKey: .from) else { return}
        guard let toView = transitionContext.view(forKey: .to) else { return}

        var containerView = transitionContext.containerView

        if toVC == self {
            // presenting
            containerView.addSubview(toView)
            toView.frame = fromView.frame
            popUpView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
            toView.alpha = 0
            UIView.animate(withDuration: 0.25, animations: {
                toView.alpha = 1
                self.popUpView.transform = CGAffineTransform.identity
            }) { _ in

                DispatchQueue.main.async {
                    transitionContext.completeTransition(true)
                }
            }
        } else {
            // dismissing
            UIView.animate(withDuration: 0.25, animations: {
                self.popUpView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
                fromView.alpha = 0
            }) { _ in
                transitionContext.completeTransition(true)
            }
        }
    }

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
}

我以这种方式在另一个视图控制器(Presenting VC)上展示了这个视图控制器(Presented VC)。 我正在使用默认的模式呈现样式。 最初我使用自定义,但是我查看了StackOverflow上的一些帖子,他们说要删除它,但仍然出现黑屏(显示VC),并且可以看到它上面的VC。

我关闭演示的VC时,显示的VC再次可见。

如果您需要更多详细信息,请告诉我。

根据执行transitionContext.completeTransition(true)时的代码,显示的VC屏幕变为黑色

2 个答案:

答案 0 :(得分:2)

您可以尝试将弹出式viewController的modalPresentationStyle设置为.overCurrentContext.overFullScreen

  

case overCurrentContext:

     
    

一种演示样式,其中内容显示在另一个视图控制器的内容上。

  

这意味着它将在viewController的内容上呈现下一个viewController。

因此,对于Container ViewController:

因此,如果您有任何tabBarController,则tabBar将允许用户与其交互。

  

case overFullScreen

     
    

一种视图呈现样式,其中所呈现的视图覆盖屏幕。

  

这意味着它将在全屏上显示下一个viewController,因此taBar在演示完成之前将不会是交互式的。

func presentNextController() {
    // In case your viewController is in storyboard or any other initialisation
    guard let nextVC = storyboard.instantiateViewController(with: "nextVC") as? NextViewController else { return }

    nextVC.modalPresentationStyle = .overFullScreen
    // set your custom transitioning delegate

    self.present(nextVC, animated: true, completion: nil)
}

答案 1 :(得分:1)

您需要设置新的视图控制器的

modalPresentationStyle = .overCurrentContext

在初始化视图控制器时或在情节提要中执行此操作。