8

Я использую оболочку контроллера вида для управления набором контроллеров дочерних представлений, которые должны иметь возможность представить другие контроллеры представлений в обычае.Использование definePresentationContext с UIModalPresentationStyle.custom

Я столкнулся с проблемой, где 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 модальный стиль перехода, который уважает definesPresentationContext. Это возможно? Я что-то упускаю?

В принципе, я хочу иметь специальную модальную презентацию в текущем контексте.

+0

Вы пробовали установить переходный делегат также в 'A'? Перед этой строкой: 'present (controllerToPresent, animated: true, completion: nil)'. попробовать это: 'self.transitioningDelegate = presentationController' Я предлагаю это при использовании:' UIModalPresentationStyle.overCurrentContext' – zero

ответ

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 должны сделать трюк.

+1

Спасибо за ваш ответ. Я проверил свой подкласс UIPresentationController и обнаружил, что он уже возвращает 'false' для' shouldPresentInFullscreen', но он все еще не дает контроллеру представления дальше вниз по дереву, определяющему контекст представления, и вместо этого получает root vc. – simeon