1

UIPresentationControllerサブクラスを使用して、プレゼンテーションと終了中に追加のビューを作成および操作するカスタム モーダル トランジションの実装に取り​​組んできました。Appleはドキュメントでこれを行う方法の例を提供していますが、私は問題にぶつかりました。

モーダルを表示すると、カスタム ビュー アニメーションは完全に機能しますが、モーダルを閉じると、dismissalTransitionWillBegin再生中のカスタム ビューに適用されるアニメーションが、元のトランジション アニメーター オブジェクトによって指定されたアニメーションと同期しなくなりますanimationControllerForDismissedController:。具体的には、カスタム ビューのアニメーションは遷移アニメーションの継続時間を無視しており、常に非常に速く再生されます (継続時間は約 0.2 秒のようです)。

animateAlongsideTransition:completion:基本アニメーションの継続時間を無視する原因は何ですか?

4

1 に答える 1

2

問題の原因は iOS のバグのようです。

アニメーション コードをどのようにリファクタリングまたは単純化しても、常に同じ結果になるので、プロジェクトの設定方法に問題の原因があるのではないかと考え始めました。カスタム モーダル トランジション コードをクリーンなプロジェクトにドロップしたところ、見よ、最初の試行で完全に機能しました。

少しずつテスト アプリをカスタマイズして、実際のアプリに近づけるようにしました。最終的には、問題を再現することができました。試行錯誤の結果、問題を引き起こしている要因の組み合わせを見つけました。

  1. 提示ビューコントローラーはUINavigationController
  2. 提示ビュー コントローラのバー ボタン項目には、画像ベースのUIBarButtonItem
  3. ウィンドウにはティントカラーセットがあります

これら 3 つの条件が満たされると、 の呼び出しのアニメーション ブロックが のanimateAlongsideTransition:呼び出しdismissalTransitionWillBeginのアニメーション ブロックの前に実行さanimateWithDuration:animateTransitionます。これにより、カスタム ビューのアニメーションが遷移アニメーションの持続時間を取得できないようです。私のテストでは、animateAlongsideTransition:アニメーションは 0.215 秒の長さで実行されました。これはデフォルトの長さだと思います。

問題を引き起こす3つの要因のうちの1つを取り除く以外に、問題の発生を防ぐ方法を見つけることができませんでした. 最終的に解決した回避策は、ウィンドウの色合いを削除し、代わりにUIViewの外観プロキシを使用してグローバルな色合いを設定することでした。ボタンの色が変わるなどの副作用がありますUIAlertViewが、私の目的では、これは許容できるトレードオフでした。

于 2015-09-07T18:09:39.470 に答える