私はたくさんのものを試してみましたが、理想的ではありませんが実用的な解決策を考え出しました。
最初の部分は、セクションインデックスがUITableViewのサブビューとして独自のビューにあることです。したがって、UITableViewに追加する可能性のあるタッチやジェスチャ認識子をキャプチャします。
第2の問題は、セクションインデックスビューがパブリックAPIの一部ではないことです。
私の解決策は、セクションインデックスビューにUIScreenEdgePanGestureRecognizerを追加することです。
このビューは、プライベートクラスUITableViewIndexのインスタンスです。それは私がのUITableView拡張を作成するには:アップルは、ビュー階層内のクラス名またはその場所を変更した場合、それが機能しなくなりますので
extension UITableView {
var sectionIndexView: UIView? {
for view in self.subviews {
if view.className() == "UITableViewIndex" {
return view
}
}
return nil
}
}
NOTEは、上記のコードでは、壊れやすいと未来はない証拠です。私の場合、エッジスワイプは便利な機能であり、画面の上部に「次へ」ボタンがあります。さらに、私のビューコントローラのほとんどはテーブルインデックスを持っていないので、それが動作を停止した場合、それはほんの数画面にしかないでしょう。したがって、このソリューションが将来的には機能しない場合、それは大きな問題ではありません。
私はまた、任意のビューからエッジジェスチャー認識を取得するために便利な関数を書いた:
extension UIView {
var screenEdgePanGestureRecognizer: UIScreenEdgePanGestureRecognizer? {
guard let gestures = self.gestureRecognizers else {
return nil
}
for gesture in gestures {
if let edgePan = gesture as? UIScreenEdgePanGestureRecognizer {
return edgePan
}
}
return nil
}
}
私は私のビューコントローラのviewDidLoad
方法でUITableView
にを追加します。
最後に、私のビューコントローラのviewDidAppear
に、ジェスチャ認識機能がセクションインデックスビューに追加されているかどうかを確認します。それがなければ、私はそれをそこに加えます。セクションインデックスがテーブルビューに追加された後のある時点(つまり、viewDidLoad
ではなく)でこれを行う必要があります。また、ジェスチャ認識機能を複数回追加しないようにする必要があります。