Обнаружить щелчок по наложению MKPolygon

Я пытался понять, если жест касания находится в наложенном многоугольнике, но безрезультатно.

Я пытаюсь составить карту наложений стран - щелкнув по наложению, я хочу узнать, из какой страны это наложение.

Сначала я нашел это: Обнаружение касаний MKOverlay в iOS7 (MKOverlayRenderer) и это: определить, находится ли точка внутри оверлея MKPolygon, который предлагает либо:

  1. сделайте крошечный прямоугольник вокруг точки касания и посмотрите, не пересекает ли он какие-либо наложения.

`` `

           //point clicked
           let point = MKMapPointForCoordinate(newCoordinates)

           //make a rectangle around this click
           let mapRect = MKMapRectMake(point.x, point.y, 0,0);

           //loop through the polygons on the map and 
           for polygon in worldMap.overlays as! [MKPolygon] {
              if polygon.intersectsMapRect(mapRect) {
                 print("found intersection")
              }
           }

`` `

  1. С помощью viewForOverlay с многообещающей функцией звучания CGPathContainsPoint, тем не мение viewForOverlay сейчас устарела.

Это заставило меня найти Обнаружение точки в MKPolygon, сломанной с iOS7 (CGPathContainsPoint), которая предлагает следующий метод:

  1. Создайте изменяемый многоугольник из точек каждого наложения (вместо использования устаревшего viewForOverlay), а затем использовать CGPathContainsPoint вернуть, если выбранная точка находится в оверлее. Однако я не могу заставить этот код работать.

`` `

func overlaySelected (gestureRecognizer: UIGestureRecognizer) {
    let pointTapped = gestureRecognizer.locationInView(worldMap)
    let newCoordinates = worldMap.convertPoint(pointTapped, toCoordinateFromView: worldMap)
    let mapPointAsCGP = CGPointMake(CGFloat(newCoordinates.latitude), CGFloat(newCoordinates.longitude));

    print(mapPointAsCGP.x, mapPointAsCGP.y)    

    for overlay: MKOverlay in worldMap.overlays {
        if (overlay is MKPolygon) {
            let polygon: MKPolygon = (overlay as! MKPolygon)
            let mpr: CGMutablePathRef = CGPathCreateMutable()

            for p in 0..<polygon.pointCount {
                let mp = polygon.points()[p]
                print(polygon.coordinate)
                if p == 0 {
                    CGPathMoveToPoint(mpr, nil, CGFloat(mp.x), CGFloat(mp.y))
                }
                else {
                    CGPathAddLineToPoint(mpr, nil, CGFloat(mp.x), CGFloat(mp.y))
                }
            }

            if CGPathContainsPoint(mpr, nil, mapPointAsCGP, false) {
                print("------ is inside! ------")
            }

        }
    }
}

`` `

Первый метод работает, но независимо от того, насколько маленьким я пытаюсь сделать высоту и ширину прямоугольника вокруг точки щелчка let mapRect = MKMapRectMake(point.x, point.y, 0.00000000001,0.00000000001); Точность касания ненадежна, поэтому вы можете нажать несколько полигонов одновременно.

В настоящее время я работаю над решением о том, какой округ находится ближе к крану, используя свойство 'MKPolygon' coordinate - который дает центральную точку многоугольника. С помощью этого можно измерить расстояние от этого многоугольника до повернутой точки, чтобы найти ближайшую. Но это не идеально, так как пользователь никогда не сможет нажать на страну, которую он намеревается.

Итак, подведем итог моим вопросам:

  1. Есть ли что-то, что я не правильно реализую во втором методе выше (один с использованием CGPathContainsPoint)?
  2. Есть ли более точный способ зарегистрировать событие при нажатии методом прямоугольника?
  3. Любые другие предложения или указатели о том, как достичь моей цели: щелкнуть карту и посмотреть, наложен ли щелчок.

0 ответов

Другие вопросы по тегам