¿Hay alguna manera de agregar texto usando el trazado de rutas?

Tengo una vista personalizada de mapa que hereda de MKOverlayPathView. Necesito esta vista personalizada para mostrar el círculo, la línea y el texto.

Ya logré dibujar un círculo y una línea usando el trazado de las funciones CGPathAddArc y CGPathAddLineToPoint.

Sin embargo, aún necesito agregar texto.

Traté de agregar texto usando

[text drawAtPoint:centerPoint withFont:font]; 

pero recibí un error de contexto no válido.

¿alguna idea?

Con MKOverlayPathView , creo que la manera más fácil de agregar texto es sobrescribir drawMapRect:zoomScale:inContext: y poner la ruta y el dibujo de texto allí (y no hacer nada en o no implementar createPath ).

Pero si va a utilizar drawMapRect todos modos, es posible que desee cambiar a la subclase de un MKOverlayView simple en lugar de MKOverlayPathView .

Con un MKOverlayView , anule el drawMapRect:zoomScale:inContext: y dibuje el círculo usando CGContextAddArc (o CGContextAddEllipseInRect o CGPathAddArc ).

Puede dibujar el texto usando drawAtPoint en este método que tendrá el context requerido.

Por ejemplo:

 -(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { //calculate CG values from circle coordinate and radius... CLLocationCoordinate2D center = circle_overlay_center_coordinate_here; CGPoint centerPoint = [self pointForMapPoint:MKMapPointForCoordinate(center)]; CGFloat radius = MKMapPointsPerMeterAtLatitude(center.latitude) * circle_overlay_radius_here; CGFloat roadWidth = MKRoadWidthAtZoomScale(zoomScale); //draw the circle... CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); CGContextSetFillColorWithColor(context, [[UIColor blueColor] colorWithAlphaComponent:0.2].CGColor); CGContextSetLineWidth(context, roadWidth); CGContextAddArc(context, centerPoint.x, centerPoint.y, radius, 0, 2 * M_PI, true); CGContextDrawPath(context, kCGPathFillStroke); //draw the text... NSString *text = @"Hello"; UIGraphicsPushContext(context); [[UIColor redColor] set]; [text drawAtPoint:centerPoint withFont:[UIFont systemFontOfSize:(5.0 * roadWidth)]]; UIGraphicsPopContext(); } 

En relación con un comentario en otra respuesta …

Cuando la coordinación central o el radio (o lo que sea) de la MKOverlay asociada cambie, puede hacer que MKOverlayView “se mueva” al llamar a setNeedsDisplayInMapRect: en él (en lugar de eliminar y agregar la superposición de nuevo). (Al usar un MKOverlayPathView , puede llamar a invalidatePath lugar).

Al llamar a setNeedsDisplayInMapRect: puede pasar el boundingMapRect de la superposición para el parámetro map map.

En la aplicación de ejemplo LocationReminders de WWDC 2010, la vista de superposición utiliza KVO para observar los cambios en MKOverlay asociado y se mueve cada vez que detecta un cambio en las propiedades del círculo, pero puede supervisar los cambios de otras formas y llamar a setNeedsDisplayInMapRect: explícitamente desde afuera la vista de superposición

(En un comentario sobre otra respuesta mencioné usando MKOverlayPathView y así es como la aplicación LocationReminders implementa una vista de superposición de círculos móviles. Pero debería haber mencionado cómo también puede usar MKOverlayView para dibujar un círculo.

Empujar el contexto con UIGraphicsPushContext generó un problema para mí. Recuérdese que el método drawMapRect:zoomScale:inContext: se llama desde diferentes subprocesos al mismo tiempo, así que tuve que sincronizar el fragmento de código que comienza cuando UIGraphicsPushContext se llama a la llamada UIGraphicsPopContext .

También al calcular el tamaño de fuente como en [UIFont systemFontOfSize:(5.0 * roadWidth)] se debe tener en cuenta la [UIScreen mainScreen].scale , que para iPad, iPad2, iPhone3 es 1 y para iPhone4 – 5 y iPad3 es 2 . De lo contrario, el tamaño del texto será diferente de iPad2 a iPad3.

Así que para mí terminó así: [UIFont boldSystemFontOfSize:(6.0f * [UIScreen mainScreen].scale * roadWidth)]