私はこれについて自分で解決策を考えてきました。たとえば、ネイティブ メール アプリの実装の動作を見ると、[戻る] ボタンをクリックすると、 の前に選択解除アニメーションが開始されますviewDidAppear
が、どちらにもありませviewWillAppear
ん。インタラクティブに閉じない場合、アニメーションは非常に高速で突然になるためです。ただし、 で対話的に非表示にして選択をviewWillAppear
解除すると、ネイティブのメール アプリケーションのように、指のジェスチャと共にセルが徐々に選択解除されます。viewWillAppear
アニメーションブロック内で内部的に呼び出されているようです。実験から、アニメーションをクリックして戻ると、目的のアニメーションが得られますperformSelector:@selector(deselect) afterDelay:0
。viewWillAppear
要約すると、ユーザーが戻るボタンをタップしたperformSelector:@selector(deselect) afterDelay:0
ときviewWillAppear
: で、ユーザーがインタラクティブにスワイプして閉じるdeselect
ときviewWillAppear
。
では、この 2 つのケースをどのように区別すればよいでしょうか。確かに十分な情報がありませんviewWillAppear
。ここで、ナビゲーション コントローラーのデリゲート メソッドを実装し、インタラクティブ ポップが開始されようとしていることをテーブル ビュー コントローラーに通知し (前にviewWillAppear
)、それを Apple の通常のインタラクティブ ポップ インタラクション コントローラーに渡すことができます。キャッチ?_interactionController
プライベート API です。ばかばかアップル。
その後、 を にフィードできることを発見しUINavigationController
ましたinteractivePopGestureRecognizer
。そのため、真ん中に座って、デリゲート メソッドをリッスンし、テーブル ビュー コントローラーにシグナルを送り、Apple のジェスチャ レコグナイザーのデリゲートの実装を呼び出すことができます。
これで十分です。おそらく、上記のオプションのプロトコルとカテゴリを使用しUITableViewController
て、ポップされたテーブル ビュー コントローラー インスタンスがシグナル メソッドに応答するかどうかをテストします。もちろん、またはサブクラス。