2015-12-31 2 views
1

Проведя день, когда я бил головой о клавиатуру, я решил поделиться своим диагнозом и решением.Почему мой взгляд не реагирует на жест, используя gestureRecognizer?

Ситуация: Вы добавить настраиваемый Вид пользовательского класса CardView к мнению ограждающей myCards в вашем приложении, и хочешь, чтобы каждая карту ответить на водопроводный жест (например, чтобы указать, что вы хотите сбросить карты). Типичный код начинать с:

В вашем ViewController:

class MyVC : UIViewController, UIGestureRecognizerDelegate { 
... 
    func discardedCard(sender: UITapGestureRecognizer) { 
     let cv : CardView = sender.view! as! CardView 
     ... 
    } 

В вашей конструкции myCards:

cv = CardView(card: card) 
myCards.addSubview(cv) 
cv.userInteractionEnabled = true 
... 
let cvTap = UITapGestureRecognizer(target: self, action: Selector("discardedCard:")) 
cvTap.delegate = self 
cv.addGestureRecognizer(cvTap) 

Я нашел аргументы здесь очень запутанным и документация не совсем полезно. Непонятно, что target: argument относится к классу, который реализует discardedCard(sender: UITapGestureRecognizer). Если вы создаете распознаватель и карты в своем ViewController, это будет self. Если вы хотите переместить discardedCard в свой собственный класс вида (например), замените self на CardView в моем примере, в том числе на делегированной строке.

Проверяя приведенный выше код, я обнаружил, что функция discardedCard никогда не вызывалась. Что происходило?

+0

Кстати, вам не нужно указывать количество кранов или касаний; по умолчанию - 1 и 1: согласно документам по умолчанию используется 1 касание (пальцы) и 1 крана: см. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITapGestureRecognizer_Class/index.html# // apple_ref/ОКК/instp/UITapGestureRecognizer/numberOfTouchesRequired – Opus1217

ответ

1

Итак, через день, вот что я должен был исправить. Надеюсь, этот контрольный список полезен кому-то другому. Я новичок в прошивку (ближайшую из Android), так что это может быть очевидными для вас ветеранов:

  1. Убедитесь, что прикоснулся вид (cv в примере) имеет userInteractionEnabled=true. Обратите внимание, что если вы используете свой собственный конструктор будет установлен ложь по умолчанию
  2. Убедитесь, что все ограждающие виды также userInteractionEnabled=true
  3. Другие выложили, что порядок delegate заявления и addGestureRecognizer заявление сделал разницу; Я не нашел, что использование Xcode 7.2 и iOS 9.2
  4. Самое главное: убедитесь, что ваш коснувшийся вид - полностью в пределах ограждающих просмотров. В моем примере я создавал контейнер myCards, который не имел правильной ширины и отсекал самые правые карты (и поскольку обрезание отключено по умолчанию, это не было визуально очевидным, пока я не посмотрел в отладчике на иерархия вида)
Смежные вопросы