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.