我正在使用视图控制器包含来管理一组子视图控制器,这些控制器应该能够以自定义方式模态呈现其他视图控制器。
当使用definesPresentationContext
UIModalPresentationStyle.custom
属性未使用的问题
例如,我有三个视图控制器:ROOT
,A
和B
ROOT
|_ A
A
是ROOT
的孩子。我想在使用自定义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
属于A
类型,实际上是ROOT
。尽管A
指定了definesPresentationContext
。
所以我认为这是因为我正在使用UIModalPresentationStyle.custom
。所以我将其更改为UIModalPresentationStyle.overCurrentContext
这会导致iOS正确地从definesPresentationContext
读取A
属性,现在使用正确的视图控制器调用我的animateTransition
函数,但是:
因为我的模态演示风格不再是.custom
,所以我的转换代理中的以下方法不再被称为
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
所以我的演示控制器没用了。
我想要一个尊重.custom
的{{1}}模态转换样式。这可能吗?我错过了什么吗?
基本上,我想在当前环境中进行自定义模态演示。
答案 0 :(得分:0)
在UIPresentationController
子类中,覆盖shouldPresentInFullscreen
,如下所示:
override var shouldPresentInFullscreen: Bool {
get {
return false
}
}
根据UIPresentationController
标题:
// By default each new presentation is full screen.
// This behavior can be overriden with the following method to force a current context presentation.
// (Default: YES)
@property(nonatomic, readonly) BOOL shouldPresentInFullscreen;
这与definesPresentationContext
一起应该可以解决问题。