ios - Utilizando definePresentationContext con UIModalPresentationStyle.custom
uiviewcontroller uipresentationcontroller (1)
Estoy utilizando la contención del controlador de visualización para administrar un conjunto de controladores de vista secundarios que deberían poder presentar modalmente otros controladores de vista de manera personalizada .
Me encontré con un problema donde la propiedad definesPresentationContext
no se usa cuando se presenta desde un controlador de vista usando UIModalPresentationStyle.custom
Como ejemplo, tengo tres controladores de vista: ROOT
, A
y B
ROOT
|_ A
A
es el hijo de ROOT
. Me gustaría presentar B
modalmente desde A
usando UIPresentationController
personalizado, UIViewControllerTransitioningDelegate
y UIViewControllerAnimatedTransitioning
.
Así que hago lo siguiente dentro del código para el controlador A
(el controlador de nota A
tiene definesPresentationContext
establecido en true
):
func buttonPressed(_ sender: Any?) {
let presentationController = MyCustomPresentation()
let controllerToPresent = B()
controllerToPresent.modalTransitionStyle = .custom
controllerToPresent.transitioningDelegate = presentationController
present(controllerToPresent, animated: true, completion: nil)
}
Sin embargo, dentro de mi controlador de presentación (que también es mi UIViewControllerAnimatedTransitioning
) encuentro el siguiente problema:
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
}
}
En esta función, donde espero que fromVC
sea del tipo A
, en realidad es ROOT
. A pesar de que A
especifica definesPresentationContext
.
Entonces me imagino que esto es porque estoy usando UIModalPresentationStyle.custom
. Así que lo cambio a UIModalPresentationStyle.overCurrentContext
Esto hace que iOS lea correctamente la propiedad definesPresentationContext
de A
, y mi función animateTransition
ahora se llama con el controlador de vista correcto, pero:
Debido a que mi estilo de presentación modal ya no es .custom
, el siguiente método en mi delegado de transición ya no se llama
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
Entonces mi controlador de presentación no se usa.
Quiero un estilo de transición modal .custom
que respete definesPresentationContext
. es posible? ¿Me estoy perdiendo de algo?
Básicamente, quiero una presentación modal personalizada dentro del contexto actual.
En su subclase UIPresentationController
, anule shouldPresentInFullscreen
siguiente manera:
override var shouldPresentInFullscreen: Bool {
get {
return false
}
}
Según el encabezado 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;
Esto junto con definesPresentationContext
debería hacer el truco.