Использование definesPresentationContext с 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. Это возможно? Я что-то упускаю?

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


person simeon    schedule 06.02.2017    source источник
comment
Пробовали ли вы установить переходного делегата также в A? Перед этой строкой: present(controllerToPresent, animated: true, completion: nil). попробуйте это: self.transitioningDelegate = presentationController Я предлагаю это при использовании: UIModalPresentationStyle.overCurrentContext   -  person vauxhall    schedule 02.08.2017


Ответы (1)


В вашем подклассе 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 должно помочь.

person capikaw    schedule 01.08.2017
comment
Спасибо за ваш ответ. Я проверил свой подкласс UIPresentationController и обнаружил, что он уже возвращает false вместо shouldPresentInFullscreen, но ему по-прежнему не дается контроллер представления ниже по дереву, определяющий контекст презентации, и вместо этого получает корневой vc. - person simeon; 11.09.2017
comment
Не работает. Сейчас я предполагаю, что definesPresentationContext не работает с UIModalPresentationStyle.custom - person Wizard; 14.07.2018