Search code examples
iphonemkmapviewmapkitcgcontextmkoverlay

lines are not being drawn on overlay view


I am trying to draw a straight line between two points in overlay view. In MKOverlayView method, I think I am doing correctly but I don't understand why it's not drawing any lines...

Does anyone know why?

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context
{
    UIGraphicsPushContext(context);

    MKMapRect theMapRect = [[self overlay] boundingMapRect];
    CGRect theRect = [self rectForMapRect:theMapRect];

    // Clip the context to the bounding rectangle.
    CGContextAddRect(context, theRect);
    CGContextClip(context);

    CGPoint startP = {theMapRect.origin.x, theMapRect.origin.y};
    CGPoint endP = {theMapRect.origin.x + theMapRect.size.width,
        theMapRect.origin.y + theMapRect.size.height};

    CGContextSetLineWidth(context, 3.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, startP.x, startP.y);
    CGContextAddLineToPoint(context, endP.x, endP.y);
    CGContextStrokePath(context);

    UIGraphicsPopContext();
}

Thank you for your help.


Solution

  • The line is being drawn using startP and endP which are CGPoint values but they are initialized using theMapRect which contains MKMapPoint values.

    Instead, initialize them using theRect which you are converting from theMapRect using rectForMapRect.

    Also, for the line width, you may want to scale it using the MKRoadWidthAtZoomScale function. Otherwise, a fixed line width of 3.0 will not be visible unless you are zoomed in very close.

    The changed code would look like this:

    CGPoint startP = {theRect.origin.x, theRect.origin.y};
    CGPoint endP = {theRect.origin.x + theRect.size.width,
        theRect.origin.y + theRect.size.height};
    
    CGContextSetLineWidth(context, 3.0 * MKRoadWidthAtZoomScale(zoomScale));
    


    Finally, instead of a custom MKOverlayView, why not use a MKPolylineView to avoid drawing lines manually?