2016-10-18 3 views
1

Я хочу переопределить поведение по умолчанию двойного нажатия на mapView.Почему мой UITapGestureRecognizer не работает, когда я прикрепляю его к элементу моего UITableViewCell?

В моем swift приложение у меня есть 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

Попробуйте установить 'UserInteractionEnabled' =' true' из 'cell.mapView' – pkc456

+0

hm, который не помог ... Я уже настроил его в раскадровке, я также написал его в коде, чтобы быть уверенным , но без каких-либо успехов: | – user3766930

+0

Вы хотите отключить прокрутку и двойное нажатие автоматического масштабирования вида карты? –

ответ

2

Вы должны были обеспечивать, что ваш собственный двойное нажатие жест распознаватель отключает стандартную двойное нажатие жест распознаватель из mapView ,
Это можно сделать, используя метод делегата:

Объявите ваш контроллер представления в качестве делегата жест распознаватель, используя 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

Рейнхард, большое спасибо за это, хотя один вопрос - будет ли решение отсюда 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 для идентификации сенсорного события, и вы можете вызвать пользовательский обработчик, когда событие trigerred

+0

не могли бы вы привести мне пример кода? – user3766930

0

Добавить mapview как подменю вида контейнера в таблицеViewCell. Установите ограничения, чтобы mapview заполнил представление контейнера entier. Отключите взаимодействие пользователя с видом карты и добавьте жест двойного касания к представлению контейнера. Этот код поможет.

let cell = myTable.dequeueReusableCell(withIdentifier: "cellStatic") as! MyTableDetailsCell 
    let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped)) 
    cell.mapView.isUserInteractionEnabled = false 
    cell.containerView.addGestureRecognizer(tap) 
    tap.numberOfTapsRequired = 2 

Теперь селектор «doubleTapped» вызывается, когда отображение карты дважды постукивается. Все другие пользовательские взаимодействия, в том числе поворот жестов карты, отключены.