使用definePresentationContext和UIModalPresentationStyle.custom

时间:2017-02-06 04:24:50

标签: ios uiviewcontroller uimodalpresentationstyle uipresentationcontroller

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

当使用definesPresentationContext

从视图控制器进行演示时,我遇到了UIModalPresentationStyle.custom属性未使用的问题

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

ROOT
 |_ A

AROOT的孩子。我想在使用自定义BAUIPresentationController的同时,UIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning模式提供{。}}。

所以我在控制器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}}模态转换样式。这可能吗?我错过了什么吗?

基本上,我想在当前环境中进行自定义模态演示。

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一起应该可以解决问题。