我试图以模态呈现视图控制器。它就像一个弹出视图控制器。
我正在使用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屏幕变为黑色
答案 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
在初始化视图控制器时或在情节提要中执行此操作。