ios uiviewcontroller uimodalpresentationstyle uipresentationcontroller

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.