tutorial manager example corelocation ios objective-c mkmapview mapkit

ios - example - location manager swift tutorial



La detección de un punto en un MKPolygon se rompió con iOS7(CGPathContainsPoint) (4)

Está trabajando directamente en 7.1, pero no en 7.0.

La respuesta de jdehlin me solucionó el problema con 7.0, es decir. llamando [view invalidatePath] antes de cada llamada a

CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, FALSE)

En una pregunta de SO que hice a principios de este año, obtuve este trozo de código:

MKPolygonView *polygonView = (MKPolygonView *)[self.mapView viewForOverlay:polygon]; MKMapPoint mapPoint = MKMapPointForCoordinate(tapCoord); CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint]; if (CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, FALSE)) { // do stuff }

Esto funciona muy bien hasta iOS7. Ahora siempre devuelve falso y no detectará un punto con la ruta.

Estoy tratando de encontrar cualquier documentación que indique que el método cambia, pero no puedo encontrar ninguno.

¿Alguna idea de por qué se rompió? O una nueva solución?


Por alguna razón (posiblemente un error), la propiedad de path devuelve NULL en la versión actual de iOS 7.

Una solución alternativa es construir su propio CGPathRef partir de los points del polígono.
Con este método, no necesita una referencia a MKPolygonView o MKPolygonRenderer .

Por ejemplo:

CGMutablePathRef mpr = CGPathCreateMutable(); MKMapPoint *polygonPoints = myPolygon.points; //myPolygon is the MKPolygon for (int p=0; p < myPolygon.pointCount; p++) { MKMapPoint mp = polygonPoints[p]; if (p == 0) CGPathMoveToPoint(mpr, NULL, mp.x, mp.y); else CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y); } CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y); //mapPoint above is the MKMapPoint of the coordinate we are testing. //Putting it in a CGPoint because that''s what CGPathContainsPoint wants. BOOL pointIsInPolygon = CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE); CGPathRelease(mpr);

Esto debería funcionar en iOS 6 también.
Sin embargo, es posible que desee realizar esta construcción manual solo si la propiedad de path la vista de superposición devuelve NULL .


El problema con su código es que el método

- (MKOverlayView *)viewForOverlay:(id < MKOverlay >)overlay

ha quedado obsoleto en iOS 7 ( Ver el documento ), debe usar esto en su lugar:

- (MKOverlayRenderer *)rendererForOverlay:(id < MKOverlay >)overlay

Por lo tanto, para que su código funcione correctamente en iOS 7, debe reemplazar:

MKPolygonView *polygonView = (MKPolygonView *)[self.mapView viewForOverlay:polygon];

con

MKPolygonRenderer *polygonView = (MKPolygonRenderer *)[self.mapView rendererForOverlay:polygon];

El problema con esto es que - rendererForOverlay: es nuevo en iOS 7, por lo que este cambio hace que su aplicación no se ejecute en versiones anteriores. Puede implementar dos versiones del método y hacer una llamada u otra dependiendo de la versión de iOS.

No he perfilado el rendimiento de esto en comparación con la solución @Anna


Yo estaba teniendo el mismo problema. Lo resolvió llamando a invalidatePath en MKPolygonRenderer antes de acceder a la ruta.