2017-07-25 17 views
2

UITableViewにUIScreenEdgePanGestureRecognizerを追加して、右からスワイプしてコントローラ階層の次の画面に移動できます。セクションインデックスを持つUITableViewの右から左へのUIScreenEdgePanGestureRecognizerの使用

テーブルビューにセクションインデックスが表示されている場合を除いて、これは正常に機能します。その場合は、セクションインデックス領域がタッチを処理するため、エッジからスワイプできません。エッジパンとセクションインデックスタップと垂直パン機能の両方をサポートできるようにしたいと考えています。

スワイプを処理するためにUITableViewの上にビューを追加しようとしましたが、それはすべてのタッチを処理し、テーブルビューは何も取得しなくなりました。

答えて

0

私はたくさんのものを試してみましたが、理想的ではありませんが実用的な解決策を考え出しました。

最初の部分は、セクションインデックスが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ではなく)でこれを行う必要があります。また、ジェスチャ認識機能を複数回追加しないようにする必要があります。

関連する問題