8

我的应用程序中有地图,它根据用户位置移动。我已经成功地为源和目标绘制了一条折线。使用以下代码

- (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;
}

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

我附上下面的图片,请让我知道当地图移动时我可以为平滑折线做些什么。

在此处输入图像描述

编辑

正如马特建议的那样,我创建了一个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];
}

但同样的问题 见下图:

在此处输入图像描述

好的,我想我有问题,我的折线添加了一次,但是随着用户的速度我改变了 MKMapView 的缩放级别,缩放级别改变了,但是折线宽度没有刷新,

那么如何动态更改 mkpolyline 的 lineWidth ?

4

3 回答 3

2

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

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

于 2014-11-10T14:37:21.167 回答
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;
}
于 2015-08-24T13:42:59.730 回答
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 覆盖对象的可视化表示。此渲染器仅描边;它没有填满它。您可以通过修改从父类继承的属性来更改多边形的颜色和其他绘图属性。您通常按原样使用此类,而不是对其进行子类化。

来自苹果图书馆

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

来自苹果图书馆

于 2014-11-10T14:27:08.593 回答