web-dev-qa-db-ja.com

iOS13でスタックしたUIViewControllerカスタム遷移

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 }
        ...
    }
}
13

上記の答えはmodalPresentationStyle.fullScreenに設定するのが正しいですが、ビューコントローラがUINavigationControllerに埋め込まれている場合は、ナビゲーションコントローラー:

navigationController.modalPresentationStyle = .fullScreen
1
Bastek

コレクションから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以降で動作しなくなるという問題が発生した場合にも役立ちます。

0