10

我正在使用视图控制器包含来管理一组子视图控制器,这些子视图控制器应该能够以自定义方式以模态方式呈现其他视图控制器。

我遇到了一个问题,即当从视图控制器使用时不使用definesPresentationContext该属性UIModalPresentationStyle.custom

例如,我有三个视图控制器:ROOTAB

ROOT
 |_ A

A是 的孩子ROOT。我想在使用 custom 、和时以B模态方式呈现。AUIPresentationControllerUIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning

所以我在控制器的代码中执行以下操作A(注意控制器AdefinesPresentationContext设置为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
    }
}

在这个函数中,我希望它是fromVCtype 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. 这可能吗?我错过了什么吗?

基本上,我想要在当前上下文中自定义模式演示。

4

1 回答 1

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应该做的伎俩。

于 2017-08-01T21:57:32.407 回答