2017-01-29 3 views
0

У меня есть представление A, которое обрабатывает UITapGestureRecogniser. Когда это само по себе, все отлично работает.TapGestureRecogniser не получает вызов, когда subview

У меня есть другой вид B, который содержит шесть объектов View A. Когда я добавляю View B в свой ViewController, UITapGestureRecogniser перестает работать.

У меня есть isUserInteractionEnabled = true на всех взглядах.

Может ли кто-нибудь определить, почему он не работает?

Как проверить, активированы ли tapGestures при касании?

Благодаря

Примечание: ViewController не имеет каких-либо UIGestureRecognisers на нем


SingleView

class QTSingleSelectionView: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initialize() 
    } 

    fileprivate func initialize() { 
     let tap = UITapGestureRecognizer(target: self, action: #selector(onTapListener)) 
     addGestureRecognizer(tap) 
    } 

    func onTapListener() { 
     print("tap") 
     _isSelected.toggle() 
     setSelection(isSelected: _isSelected, animated: true) 
    } 

} 

Несколько представлений

class QTMutipleChoiceQuestionSelector: UIView { 

    var selectors: [QTSingleSelectionView] = [] 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initialize() 
    } 

    fileprivate func initialize() { 

     for selector in selectors { 
      selector.removeFromSuperview() 
     } 

     selectors.removeAll() 

     guard let dataSource = dataSource else { return } 

     let count = dataSource.numberOfAnswers(self) 

     for index in 0..<count { 
      let selector = QTSingleSelectionView() 

      selector.frame = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
      selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
      selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
      selector.isUserInteractionEnabled = true 
      addSubview(selector) 
     } 
    } 

} 

ViewContro Мюллером

lazy var multipleChoiceView: QTMutipleChoiceQuestionSelector = { 
    let selector = QTMutipleChoiceQuestionSelector() 
    selector.dataSource = self 
    selector.isUserInteractionEnabled = true 
    return selector 
}() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    view.addSubview(multipleChoiceView) 

} 
+0

могли бы вы показать код? –

+0

@ AndréSlotta Я добавил код, спасибо – ilan

+0

Таким образом, проблема состояла в том, что не вызывал инициализатор init (frame: CGRect) вместо init() в представлениях, но вы отклонили мой ответ: «У меня нет проблемы с расположением взгляды ", я также упомянул в своих комментариях, чтобы проверить ваш мультивизор, если он принимает gestureRecognizer, но вы проголосовали за мой ответ! –

ответ

1

Я проверил ваш код. проблема в строке:

let selector = QTMutipleChoiceQuestionSelector() //Wrong! 

Эта строка инициализирует вид с рамкой (0,0,0,0), что означает, что он не может принимать сенсорный событие, даже если бы вы могли видеть его. решение дает представление размера, чтобы получать события:

let selector = QTMutipleChoiceQuestionSelector(frame: CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height)) 
0

Попробуйте это - Вместо:

for index in 0..<count { 
     let selector = QTSingleSelectionView() 

     selector.frame = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
     selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
     selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
     selector.isUserInteractionEnabled = true 
     addSubview(selector) 
    } 

Вы должны использовать:

for index in 0..<count { 
    let aFrame: CGRect = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
    let selector = QTSingleSelectionView(frame: aFrame) 

    selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
    selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
    selector.isUserInteractionEnabled = true 
    addSubview(selector) 
} 

Это будет вызывать соответствующий инициализатор, который init(frame: CGRect) который имеет initializer() внутри него. Но прямо сейчас ваш кодовый вызов по умолчанию init() функция UIView, у которой нет пользовательской инициализации.

+0

Как это отвечает на мой вопрос? У меня нет проблем с расположением представлений, у меня проблема с tapGesture. – ilan

+0

Я отредактировал ответ, также добавил нижнее описание, посмотрим, разрешит ли он вашу проблему. –

+0

Не нужно менять инициализатор, функция initialzer вызывает вызов. – ilan

 Смежные вопросы

  • Нет связанных вопросов^_^