J'ai implémenté une transition personnalisée entre deux contrôleurs de vue dans mon application iOS et cela a bien fonctionné avec iOS 10, 11 et 12.
Maintenant, je veux le préparer pour iOS 13 en utilisant Xcode 11 beta 6 et iOS 13 beta 8, mais la transition est bloquée.
La transition personnalisée doit déplacer le premier contrôleur de vue vers le haut et hors de l'écran et le second de bas en haut. Mais maintenant, il revient au style de présentation par défaut d'iOS13 pageSheet
, réduit simplement un peu le premier contrôleur de vue et ajoute une superposition grisée. Mais la deuxième vue n'apparaît pas.
J'ai trouvé que dans la méthode animatePresentation(context: UIViewControllerContextTransitioning)
le context
ne retourne pas de vue 'from', donc context.view(forKey: .from)
retourne nil
.
Que suis-je censé faire sans une vue "de"?
FlyUpTransition.Swift
class FlyUpTransition: NSObject, UIViewControllerAnimatedTransitioning {
var mode: Mode = .present
enum Mode {
case present
case dismiss
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return TimeInterval(0.45)
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
switch mode {
case .present:
animatePresentation(context: transitionContext)
case .dismiss:
animateDismissal(context: transitionContext)
}
}
func animatePresentation(context: UIViewControllerContextTransitioning) {
guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
...
}
func animateDismissal(context: UIViewControllerContextTransitioning) {
guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
...
}
}
La réponse ci-dessus est correcte pour définir modalPresentationStyle
sur .fullScreen
, mais il convient également de mentionner que si votre contrôleur de vue est intégré dans un UINavigationController
, vous devez le définir sur le contrôleur de navigation:
navigationController.modalPresentationStyle = .fullScreen
J'ai installé la séquence dans IB par glisser-déposer d'une collection VC vers un autre VC, qui est utilisé pour afficher les détails.
J'ai de nouvelles découvertes sur ce problème, Pour faire référence à "toView" et "fromView", les deux méthodes suivantes fonctionnent
Manière indirecte:
transitionContext.viewController(forKey: .to)?.view
transitionContext.viewController(forKey: .from)?.view
Directement façon:
transitionContext.view(forKey: .to)
transitionContext.view(forKey: .from)
Mais lorsque je suis passé du style de séquence à "Over Full Screen", la manière directe retourne "nil" pour "toView" et "fromView" et seulement indirectement.
J'espère que cela sera utile à quelqu'un à l'avenir.
P.S. C'est ma découverte le long de mon chemin vers résoudre un autre problème , ce qui pourrait être utile, si vous rencontrez également le problème `` un animateur qui travaille '' cesse de fonctionner dans iOS 13 et supérieur