动态更改mkpolyline的lineWidth

时间:2014-11-10 14:19:04

标签: ios mkmapview mkpolyline

我的应用程序中有Map按用户位置移动。我已成功绘制了源和目标的折线。 使用以下代码

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

    MKPolylineView *view1 = [[MKPolylineView alloc] initWithOverlay:overlay];

        view1.lineWidth = 27.0;
        view1.strokeColor = [UIColor colorWithRed:55.0/255.0 green:168.0/255.0 blue:219.0/255.0 alpha:1];

    return view1;
}

但是我的问题是当地图移动时,意味着我在用户移动时改变地图的区域,然后有时候折线显示不好,有时它的显示比实际尺寸更厚,如下图所示。

我正在附上下面的图片,请告诉我在地图移动时我可以为平滑折线做些什么。

enter image description here

修改

Matt建议我创建一个 MKPolylineRenderer 的子类,并按如下方式实现drawMapRect方法:

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


    CGMutablePathRef fullPath = CGPathCreateMutable();
    BOOL pathIsEmpty = YES;

    //merging all the points as entire path
    for (int i=0;i< self.polyline.pointCount;i++){
        CGPoint point = [self pointForMapPoint:self.polyline.points[i]];
        if (pathIsEmpty){
            CGPathMoveToPoint(fullPath, nil, point.x, point.y);
            pathIsEmpty = NO;
        } else {
            CGPathAddLineToPoint(fullPath, nil, point.x, point.y);
        }
    }

    //get bounding box out of entire path.
    CGRect pointsRect = CGPathGetBoundingBox(fullPath);
    CGRect mapRectCG = [self rectForMapRect:mapRect];
    //stop any drawing logic, cuz there is no path in current rect.
    if (!CGRectIntersectsRect(pointsRect, mapRectCG))return;

    UIColor *darker = [UIColor blackColor];
    CGFloat baseWidth = 10 / zoomScale;

    // draw the dark colour thicker
    CGContextAddPath(context, self.path);
    CGContextSetStrokeColorWithColor(context, darker.CGColor);
    CGContextSetLineWidth(context, baseWidth * 1.5);
    CGContextSetLineCap(context, self.lineCap);
    CGContextStrokePath(context);

    // now draw the stroke color with the regular width
    CGContextAddPath(context, self.path);
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, baseWidth);
    CGContextSetLineCap(context, self.lineCap);
    CGContextStrokePath(context);

    [super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
}

但同样的问题 见下图:

enter image description here

好吧,我认为我遇到了问题,我的折线被添加一次,但是作为用户的速度我改变了MKMapView的缩放级别,缩放级别改变了,但折线宽度没有刷新,

那我怎么能动态改变mkpolyline的lineWidth?

3 个答案:

答案 0 :(得分:2)

问题在于您将lineWidth设置为固定宽度(非常大的固定宽度)。随着地图缩放变大或变小,这会变大或变小。

相反,实现自己的MKOverlayRenderer子类,并覆盖drawMapRect:zoomScale:inContext:。它会收到一个zoomScale参数,因此您可以调整线条的宽度,以便了解当前的比例。

答案 1 :(得分:2)

子类MKPolylineRenderer并覆盖applyStrokePropertiesToContext:atZoomScale:以便忽略比例,并以恒定宽度绘制线条:

@interface ConstantWidthPolylineRenderer : MKPolylineRenderer
@end

@implementation ConstantWidthPolylineRenderer

- (void)applyStrokePropertiesToContext:(CGContextRef)context
                           atZoomScale:(MKZoomScale)zoomScale
{
    [super applyStrokePropertiesToContext:context atZoomScale:zoomScale];
    CGContextSetLineWidth(context, self.lineWidth);
}

@end

现在使用它并欣赏它的平滑渲染:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolyline *polyline = (MKPolyline *)overlay;
    ConstantWidthPolylineRenderer *renderer = [[ConstantWidthPolylineRenderer alloc] initWithPolyline:polyline];
    renderer.strokeColor = [UIColor redColor];
    renderer.lineWidth = 40;
    return renderer;
}

答案 2 :(得分:1)

您需要使用MKPolylineRenderer代替MKPolylineView

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id < MKOverlay >)overlay {
    @try {

        MKPolylineRenderer *renderer = [[[MKPolylineRenderer alloc] initWithOverlay:overlay];
        renderer.lineWidth = 27.0;
        renderer.strokeColor = [UIColor colorWithRed:55.0/255.0 green:168.0/255.0 blue:219.0/255.0 alpha:1];

        return renderer;
    }
    @catch (NSException *exception) {
        NSLog(@"exception :%@",exception.debugDescription);
    }
}

阅读本文:

  

MKPolylineRenderer类为MKPolyline叠加层对象提供可视化表示。此渲染器仅划线;它没有填补它。您可以通过修改从父类继承的属性来更改多边形的颜色和其他绘图属性。您通常按原样使用此类,不要将其子类化。

From Apple library

  

MKPolylineView类提供MKPolyline注释对象的可视化表示。此视图描绘注释表示的路径。 (此类不会填充路径所包含的区域。)您可以通过修改从MKOverlayPathView类继承的属性来更改路径的颜色和其他绘图属性。此类通常按原样使用,而不是子类。

From Apple library