1

iOSのUITableViewControllerには、行選択用の微妙なアニメーションが含まれており、([戻る] ボタンを使用して) ビューに戻ると、以前に選択した行が一時的に強調表示されます。これにより、ユーザーはアプリ内での位置感覚を得ることができます。

s の場合UIViewController、この動作は無料ではありません。含める簡単な方法は、 で選択した行を手動で選択解除することviewWillAppearです。

ただし、iOS 7 では、ユーザーはナビゲーション スタックを後方に「ドラッグ」できます。部分的にドラッグしてからドラッグ アクションを完了しないviewWillAppearと、行が起動して選択解除されます。ユーザーが実際に戻ったとき、行は選択されていません。

を使用viewDidAppearすると、この問題は確実に解決されますが、アニメーションは後で (明らかに) トリガーされ、アプリの動作が遅くなります。

これを解決する方法を思いついた人はいますか?

4

1 に答える 1

1

私はこれについて自分で解決策を考えてきました。たとえば、ネイティブ メール アプリの実装の動作を見ると、[戻る] ボタンをクリックすると、 の前に選択解除アニメーションが開始されますviewDidAppearが、どちらにもありませviewWillAppearん。インタラクティブに閉じない場合、アニメーションは非常に高速で突然になるためです。ただし、 で対話的に非表示にして選択をviewWillAppear解除すると、ネイティブのメール アプリケーションのように、指のジェスチャと共にセルが徐々に選択解除されます。viewWillAppearアニメーションブロック内で内部的に呼び出されているようです。実験から、アニメーションをクリックして戻ると、目的のアニメーションが得られますperformSelector:@selector(deselect) afterDelay:0viewWillAppear

要約すると、ユーザーが戻るボタンをタップしたperformSelector:@selector(deselect) afterDelay:0ときviewWillAppear: で、ユーザーがインタラクティブにスワイプして閉じるdeselectときviewWillAppear

では、この 2 つのケースをどのように区別すればよいでしょうか。確かに十分な情報がありませんviewWillAppear。ここで、ナビゲーション コントローラーのデリゲート メソッドを実装し、インタラクティブ ポップが開始されようとしていることをテーブル ビュー コントローラーに通知し (前にviewWillAppear)、それを Apple の通常のインタラクティブ ポップ インタラクション コントローラーに渡すことができます。キャッチ?_interactionControllerプライベート API です。ばかばかアップル。

その後、 を にフィードできることを発見しUINavigationControllerましたinteractivePopGestureRecognizer。そのため、真ん中に座って、デリゲート メソッドをリッスンし、テーブル ビュー コントローラーにシグナルを送り、Apple のジェスチャ レコグナイザーのデリゲートの実装を呼び出すことができます。

これで十分です。おそらく、上記のオプションのプロトコルとカテゴリを使用しUITableViewControllerて、ポップされたテーブル ビュー コントローラー インスタンスがシグナル メソッドに応答するかどうかをテストします。もちろん、またはサブクラス。

于 2013-10-21T19:54:51.327 に答える