IOSアプリに2つのView Controller間のカスタム遷移を実装しましたが、iOS 10、11、および12で正常に動作しました。
Xcode 11ベータ6とiOS 13ベータ8を使用してiOS 13に対応できるようにしたいのですが、移行が行き詰まっています。
カスタムトランジションでは、最初のビューコントローラーを上に移動して画面から出し、2番目のビューコントローラーを下から上に移動します。しかし、現在はiOS13のデフォルトのプレゼンテーションスタイルpageSheet
にフォールバックし、最初のビューコントローラを少し縮小して、淡色表示のオーバーレイを追加しています。しかし、2番目のビューは表示されません。
メソッドanimatePresentation(context: UIViewControllerContextTransitioning)
ではcontext
は「from」ビューを返さないため、context.view(forKey: .from)
はnil
を返します。
「から」のビューなしで何をすべきですか?
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 }
...
}
}
上記の答えはmodalPresentationStyle
を.fullScreen
に設定するのが正しいですが、ビューコントローラがUINavigationController
に埋め込まれている場合は、ナビゲーションコントローラー:
navigationController.modalPresentationStyle = .fullScreen
コレクションからVC=詳細を表示するために使用される別のVCにドラッグアンドドロップすることにより、IBでセグエを設定しました。
この問題について新しい発見があります。「toView」と「fromView」を参照するには、次の両方の方法が機能します
間接的に:
transitionContext.viewController(forKey: .to)?.view
transitionContext.viewController(forKey: .from)?.view
直接的な方法:
transitionContext.view(forKey: .to)
transitionContext.view(forKey: .from)
しかし、セグエスタイルを「Over Full Screen」に切り替えると、直接的な方法で「toView」と「fromView」の両方に「nil」が返され、間接的にしか機能しなくなります。
これが将来の誰かに役立つことを願っています。
追伸これは私の方法での発見です 別の問題を解決する 。これは、「動作しているアニメーター」がiOS 13以降で動作しなくなるという問題が発生した場合にも役立ちます。