UIView захватывает движения одним пальцем, но посылает щепотку двумя пальцами, чтобы рассмотреть позади - PullRequest
0 голосов
/ 03 октября 2018

У меня есть приложение с MKMapView и наложением UIView, где пользователь может рисовать многоугольники поверх карты, что выполняется с помощью touchesBegan, touchesMoved и т. Д., А затем накапливаетсякоснитесь местоположений и добавьте их в качестве пути для CAShapeLayer .`

. Это прекрасно работает, но мы также хотим иметь возможность ущипнуть, чтобы увеличить масштаб просмотра карты.

Итак, нам нужно следующее:

Касание или перетаскивание одним пальцем должно быть зафиксировано наложенным видом и записано как ввод в полигон, который рисует пользователь.

Мультитач (касание, вращение и т. Д.) Должно быть передано на карту (которая находится за оверлеем)

Какой самый умный способ сделать это?Очевидно, что ни hitTest, ни touchesMoved не могут сказать мне, сколько пальцев на экране.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Я решил это, добавив распознаватель жестов панорамирования в вид карты и установив максимальный предел в 1 палец.И установите isUserInteractionEnabled на false в моем наложении, которое вместо этого получило новые методы для получения сенсорных событий.

В действии для распознавателя панорамирования жестами я включаю состояние распознавателя и отправляю действия на свое наложениевид, говорящий о том, что касания начались, продолжились или закончились.И я установил mapView.isScrollEnabled = false во всех случаях, кроме отмены, завершения и сбоя, где я включаю его снова, так что он работает, когда пользователь делает два нажатия пальцем / перетаскивание и т. Д.

0 голосов
/ 03 октября 2018

Я полагаю, что вы захотите реализовать this в своем оверлее.

let panGesture = UIPanGestureRecognizer(target: self, action:#selector(draggedView(sender:)))
panGesture.delegate = self

@objc func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                             shouldReceive touch: UITouch) -> Bool {
    if gestureRecognizer is UIPanGestureRecognizer {
        return false
    }
    return true
}

Вы проверяете, является ли это жестом повышения (или gest.numberOfTouches> 1), и не обрабатываетеэто если это так.Событие должно всплыть до вида карты.

...