2016-10-18 4 views
1

mapViewをダブルタップするデフォルトの動作をオーバーライドしたいと思います。私swiftアプリでUITableViewCellの要素にUITapGestureRecognizerを接続するとUITapGestureRecognizerが機能しないのはなぜですか?

私は、静的セル内mapViewを持っているので、この方法cellForRowAtに私がUITapGestureRecognizerを追加することに決めました。これは私がそれを行う方法です。

func tableView(_ myTable: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if (indexPath as NSIndexPath).row == 0 { 
     let cell = myTable.dequeueReusableCell(withIdentifier: "cellStatic") as! MyTableDetailsCell 

     cell.mapView.isScrollEnabled = false //this works 

     //this does not: 
     let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped)) 
     tap.numberOfTapsRequired = 2 
     cell.mapView.addGestureRecognizer(tap) 
     ... 

そして私は、簡単な関数があります。

func doubleTapped() { 
    print("map tapped twice") 
} 

しかし、私は二度マップをタップ - それはズームインして何も印刷がコンソールログにありません - そうし私のコードは動作しません。私は何を取りこぼしたか?

+0

'cell.mapView'の' UserInteractionEnabled' = 'true'を設定しようとしています – pkc456

+0

hmは役に立たなかった...私は既にストーリーボードに設定していましたが、コードに書きました。これまでどんな成功もしていませんでした。 – user3766930

+0

マップビューのスクロールとダブルタップの両方の自動ズームを無効にしますか? –

答えて

2

をtrigerredされたときに、あなたのカスタムハンドラを呼び出すことができます。
これは、デリゲートメソッドを使用して行うことができます。

UIGestureRecognizerDelegate

を使用して、ジェスチャー認識の代理人としてあなたのビューコントローラを宣言するには、独自のダブルタップジェスチャー認識のためのプロパティを定義します。

var myDoubleTapGestureRecognizer: UITapGestureRecognizer? 

ダブルタップジェスチャ認識機能を設定します。 viewDidLoad

myDoubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(doubleTapped)) 
myDoubleTapGestureRecognizer!.numberOfTapsRequired = 2 
myDoubleTapGestureRecognizer!.delegate = self 
mapView.addGestureRecognizer(myDoubleTapGestureRecognizer!) 

ここではデリゲートが設定されています。

には、次のデリゲートメソッドを実装します。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
         shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    if ((gestureRecognizer == myDoubleTapGestureRecognizer) && (otherGestureRecognizer is UITapGestureRecognizer)) { 
     let otherTapGestureRecognizer = otherGestureRecognizer as! UITapGestureRecognizer 
     return otherTapGestureRecognizer.numberOfTapsRequired == 2 
    } 
    return true 
} 

あなたはダブルタップmapView、このデリゲートメソッドがtrueを返すときに、他のジェスチャー認識がある場合は、内蔵mapViewのダブルタップ認識。つまり、内蔵のダブルタップレコグナイザーは、自分のダブルタップレコグナイザがダブルタップを認識できない場合にのみ発火することができます。
私はそれをテストしました。地図はもはやズームされず、メソッドdoubleTappedが呼び出されました。

+0

Reinhard、ありがとう、1つの質問 - ここからの解決策http://stackoverflow.com/questions/40074084/is-there-any-way-of-allowing-zooming-mkmapview-only-to -a-specific-region-while(あなたの提案にマージされています)は一緒に動作しますか? – user3766930

+0

両方の問題が完全に独立しているように思えるので、それはそうだと思います。私の提案する解決策では、内蔵のダブルタップジェスチャ認識機能を無効にし、他の部分はそのまま残すようにしてください。 –

+0

ありがとう、私は一瞬でそれを試してみましょう、あなたに教えて! – user3766930

0

タッチイベントを識別するために、touchesBeganを使用してみてください、そしてイベントはあなたがあなた自身のダブルタップジェスチャー認識がmapViewの標準ダブルタップジェスチャー認識を無効にすることを強制しなければならなかった

+0

私はいくつかのコード例を教えていただけますか? – user3766930

0

mapViewをtableViewCellのコンテナビューのサブビューとして追加します。マップビューがエンティティコンテナビューを満たすように制約を設定します。マップビューのユーザー操作を無効にし、ダブルタップジェスチャーをコンテナビューに追加します。このコードは役に立ちます。

マップビューを2回タップすると、「doubleTapped」セレクタが呼び出されます。マップビューの回転ジェスチャーを含む他のすべてのユーザー操作は無効になります。

関連する問題