Я использую сдерживание контроллера представления для управления набором дочерних контроллеров представления, которые должны иметь возможность модально представлять другие контроллеры представления настраиваемым образом.
Я столкнулся с проблемой, когда свойство 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
. Это возможно? Я что-то упускаю?
По сути, я хочу пользовательскую модальную презентацию в текущем контексте.
A
? Перед этой строкой:present(controllerToPresent, animated: true, completion: nil)
. попробуйте это:self.transitioningDelegate = presentationController
Я предлагаю это при использовании:UIModalPresentationStyle.overCurrentContext
- person vauxhall   schedule 02.08.2017