我正在使用视图控制器包含来管理一组子视图控制器,这些子视图控制器应该能够以自定义方式以模态方式呈现其他视图控制器。
我遇到了一个问题,即当从视图控制器使用时不使用definesPresentationContext
该属性UIModalPresentationStyle.custom
例如,我有三个视图控制器:ROOT
、A
和B
ROOT
|_ A
A
是 的孩子ROOT
。我想在使用 custom 、和时以B
模态方式呈现。A
UIPresentationController
UIViewControllerTransitioningDelegate
UIViewControllerAnimatedTransitioning
所以我在控制器的代码中执行以下操作A
(注意控制器A
已definesPresentationContext
设置为true
):
func buttonPressed(_ sender: Any?) {
let presentationController = MyCustomPresentation()
let controllerToPresent = B()
controllerToPresent.modalTransitionStyle = .custom
controllerToPresent.transitioningDelegate = presentationController
present(controllerToPresent, animated: true, completion: nil)
}
但是,在我的演示控制器(也是我的UIViewControllerAnimatedTransitioning
)中,我遇到了以下问题:
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let fromVC = transitionContext.viewController(forKey: .from)
let toVC = transitionContext.viewController(forKey: .to)
if let fromVC = fromVC as? A,
let toVC = toVC as? B {
//Do the presentation from A to B
}
}
在这个函数中,我希望它是fromVC
type A
,它实际上是ROOT
。尽管A
指定definesPresentationContext
.
所以我认为这是因为我正在使用UIModalPresentationStyle.custom
. 所以我把它改成UIModalPresentationStyle.overCurrentContext
这会导致 iOS 从 正确读取definesPresentationContext
属性A
,并且我的animateTransition
函数现在被正确地从视图控制器调用,但是:
因为我的模态演示样式不再是.custom
,所以我的转换委托中的以下方法不再被调用
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
所以我的演示控制器变得未使用。
我想要一种.custom
尊重definesPresentationContext
. 这可能吗?我错过了什么吗?
基本上,我想要在当前上下文中自定义模式演示。