0

私はナビゲーションコントローラのトランジションのスライドアニメーションを作成しようとしています。たとえば、VCをプッシュすると、プレゼンテーションと提示されたVCはUIPageViewControllerのように遷移します。ここでカスタムUINavigationControllerアニメーションが終了したときに応答しない

は、私がこれまでにコード化されたものです:

guard let fromView = transitionContext.view(forKey: .from), 
     let toView = transitionContext.view(forKey: .to) 
    else { return } 

    let containerView = transitionContext.containerView 

    toView.frame = CGRect(x: -toViewFrameHorizationtalPosition, 
         y: 64, 
         width: UIScreen.main.bounds.width, 
         height: UIScreen.main.bounds.height) 

    containerView.addSubview(fromView) 
    containerView.addSubview(toView) 

    UIView.animate(withDuration: transitionDuration(using: transitionContext), 
       delay: 0, 
       options: .curveEaseInOut, 
       animations: { 
        containerView.frame.origin.x = self.toViewFrameHorizationtalPosition 
    }) { completed in 
    transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
    } 

アニメーションはビューが応答しなくなった実行後の遷移アニメーションが、私はそれがあることを期待通りに起こったがたとえ様々な試みに反しています。タッチイベントは認識されません。

ナビゲーションバーは正常に機能しますが、最初のビューに切り替えると、そのビューも応答しなくなります。

私はこの問題を発見することはできませんが、これについて多くのことを読んだことがありますが、しばらくの間これを苦労しています。何か案は?

+1

まず、 'fromView'はすでに' containerView'に入っているはずなので、再度サブビューを追加する必要はありません。次に、 'containerView'のフレームを変更しているように見えますが、本当に' fromView'や 'toView'(あるいはその両方)のフレームを' containerView'の中で変更したくないのですか? – DonMag

答えて

0

さて、私は最終的に解決策を見つけました。彼のすばらしいコメントで私を正しい方向に向けるための@DonMagへの多くの多くの感謝!

最初に、@DonMagにも言及したように、を既にそこにあるようにcontainerViewに追加する必要はありませんでした。

  • 私はそれを右に位置決めするtoViewのフレーム原点のX値を変更した応答しないこととにかく

    、提示ビュー、toViewに伴う問題は、スライドアニメーションを作成する目的のためということでしたコンテナビューの内部では、

  • であり、コンテナビューはフレームの原点のx値を変更して再び移動します。 fromViewtoViewの両方を、横に並べて、つまりUIPageViewControllerのアニメーションのように動作させたいので、コンテナビューを移動しています。

問題は、元の値に戻していないことでした。 toViewcontainerViewのフレーム原点をアニメーション補完ブロックの元の値に戻すと、すべてが正常に機能しました。

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
    guard let toView = transitionContext.view(forKey: .to) 
     else { return } 

    toView.removeFromSuperview() 
    toView.frame = CGRect(x: -toViewFrameHorizationtalPosition, 
          y: 64, 
          width: UIScreen.main.bounds.width, 
          height: UIScreen.main.bounds.height) 

    let containerView = transitionContext.containerView 
    containerView.addSubview(toView) 

    UIView.animate(withDuration: transitionDuration(using: transitionContext), 
        delay: 0, 
        options: .curveEaseInOut, 
        animations: { 
            containerView.frame.origin.x = self.toViewFrameHorizationtalPosition 
    }) { completed in 
     containerView.frame.origin.x = 0 
     toView.frame.origin.x = 0 
     transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
    } 
} 

P.S.:ここ

は、改訂されたアニメーションのコードです@DonMagに感謝します。あなたの洞察は本当に役に立ちました。