2015-12-30 6 views
0

Я пытаюсь всплывающее окно для моего приложения. Пока всплывающее окно всплывает с фиксированной координатой, я пытаюсь заставить его попсовать в точке, где пользователь постучал. Это то, что у меня есть:touchsBegan функция никогда не вводится

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    print("touchesbegan") 
    for touch in touches{ 
     //Handle touch 
     let location = touch.locationInView(self.view) 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 

     let vc = storyboard.instantiateViewControllerWithIdentifier("ColonyPopoverController") as! ColonyPopoverController 
     vc.modalPresentationStyle = .Popover 
     vc.preferredContentSize = CGSizeMake(200, 150) 

     if let popoverController = vc.popoverPresentationController { 
      popoverController.delegate = self 
      popoverController.sourceRect = CGRectMake(location.x, location.y, 20, 10) 
      popoverController.sourceView = self.view 
      self.presentViewController(vc, animated: true, completion: nil) 
     } 
    } 
} 

Я заметил, что оператор печати никогда не печатает, когда я нажимаю на симулятор.

У меня есть interaction и multi-touch включен в мой взгляд. Я знаю, что это работает хорошо, потому что я и он интегрирован с Google Maps, так что, когда я нажимаю, появляется штырьковый Google:

func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D) { 
    print("You tapped at \(coordinate.latitude), \(coordinate.longitude)") 
    let marker = GMSMarker() 
    marker.position = CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude) 
    marker.title = "Sydney" 
    marker.snippet = "Australia" 
    marker.map = mapView 

}

и я вижу операторы печати при печати, а также. Не уверен, что мне здесь не хватает.

взаимодействие пользователя включен для обоих надтаблицы и вид:

enter image description here

enter image description here

ответ

2

Оказывается GMSView GoogleMaps' потребляет другие жесты в поле зрения и он должен быть явно запрещены:

mapView.settings.consumesGesturesInView = false; 
0

Если userInteractionEnabled верно, то touchesBegan следует назвать и ваш код будет работать, и всплывающее окно появится там, где пользовательские краны.

Если ваше представление является подвью, то убедитесь, что userInteractionEnabled истинно для любых супервизоров. Посмотрите на this answer для получения дополнительной информации о touchhesBegan не вызывается.

+0

Спасибо за ваш ответ. Взаимодействие с пользователем включено для просмотра и просмотра, прикрепленных скриншотов и обновленного вопроса. – Siddhartha

+1

Я нашел причину. GMSView Googlemaps потребляет другие жесты в представлении, и он должен быть запрещен: '' 'mapView.settings.consumesGesturesInView = false;' ''. – Siddhartha

3

Есть три основные причины, почему вид не получает штрихи, когда вы ожидаете его:

  • Он имеет userInteractionEnabled значение ЛОЖЬ. Очевидно, вы уже подтвердили, что это не так.

  • Некоторые другие виды «сверху» представляют интерес и получают штрихи. Обратите внимание, что дочерний вид находится поверх своего родителя (в области, охватываемой дочерним элементом), а представление ниже в контуре документа раскадровки находится поверх всех братьев и сестер, которые выше в контуре. (На вашем снимке экрана KittyMapper® находится поверх Map View, в любой области, где они перекрываются.) Вам нужно установить userInteractionEnabled в значение false, если вы не хотите, чтобы верхний вид получал штрихи.

  • Вид интереса находится за пределами его родителя.

    Хит-тестирование работает рекурсивно: окно вызывает hitTest(_:withEvent:) на каждом из своих дочерних элементов (в порядке сверху вниз), пока один возвращает не-nil; hitTest(_:withEvent:) возвращает nil немедленно, если pointInside(_:withEvent:) возвращает false; в противном случае hitTest(_:withEvent:) звонит hitTest(_:withEvent:) на ребенка (в порядке сверху вниз) до тех пор, пока один возвращает не-ниль, и возвращает self, если ни один из детей не сообщит о хите.

    Таким образом, если ребенок находится вне границ своего родителя, он может быть виден (если все предки имеют clipsToBounds значения ЛОЖЬ), но никогда не получает штрихи, потому что его родитель pointInside(_:withEvent:) отклонят штрихи, которые кажутся на взгляде ребенка.

Вы можете быть в состоянии диагностировать последние два случая, проверяя вашу иерархию просмотра с помощью Xcode's “Debug View Hierarchy” feature.

+0

Спасибо за ваш ответ. Вместо этого я использовал gestureRecognizer и заметил такое же поведение. Я считаю, что моя карта переопределяет распознаватели касаний с помощью метода '' 'didTapAtCoordinate''. Интересно, не могут ли они использоваться совместно. Попытайтесь попробовать функцию '' 'Debug View Hierarchy'', спасибо. – Siddhartha

+0

Я нашел причину. GMSView Googlemaps потребляет другие жесты в представлении, и он должен быть запрещен: '' 'mapView.settings.consumesGesturesInView = false;' ''. – Siddhartha

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