添加新叠加层时,MKMapView会覆盖重绘(闪烁)。 MKPolyLines是锯齿状的

时间:2013-03-28 17:13:40

标签: ios mkmapview mapkit mkpolygon

我正在MKMapView上测试一些基本的绘图功能,我发现了一些奇怪的事情。您可以参考下面的保管箱链接。这是在实际设备上运行和测试的 - 而不是模拟器。

你会注意到一些MKPolyLines在连接时是锯齿状的,有些则没有。造成这种情况的原因是什么,可以纠正吗?我没有看到任何设置抗锯齿的选项。你认为最右边的多边形你可以看到它。但总的来说,似乎有些线条比其他线条更平滑。

此屏幕截图未显示的另一件事是,每次我点击视图添加新的叠加层时,地图上的所有叠加层都会“闪烁”,就好像它们正在重新绘制或者可能没有快速重绘一样足够。想知道这是什么原因或者我应该做其他事情以防止这种情况发生,我不知道。

还有关于代表的问题。如果您的地图上有100种不同的叠加层怎么办?你是否应该对代表中的每一个进行检查,以告诉它要执行什么样的绘图?在我的情况下,只有3个案例,但我可以想象这个方法可以变得非常大,我在这里设置。我知道这是一个旁边的问题,但我想我会在这里插入它。

https://www.dropbox.com/s/dbordqnml33urmu/Screenshot%202013.03.28%2011.26.36.png

这是相关代码:

-(void)addCoordinateToList:(UITapGestureRecognizer*)recognizer{
    CGPoint tappedPoint = [recognizer locationInView:map];
    CLLocationCoordinate2D coord = [map convertPoint:tappedPoint toCoordinateFromView:map];
    NSLog(@"Coordinate Info: Lat %f, Lon %f", coord.latitude, coord.longitude);

    CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
    //Extension NSValue new for iOS6
    //[path addObject:[NSValue valueWithMKCoordinate:coord]];
    [path addObject:newLocation];

    [self drawPolygon];

    clearPolygonFromMap.enabled = YES;
    clearPolygonFromMap.alpha = 1.0;

    //add annotations
    [self setPolygonAnnotationWithCoordinate:coord andWithTitle:@"default title"];

}

//绘制折线。设置多边形但不要添加为叠加,直到完成绘制形状。此代码不包括在内,因为此处有许多按钮状态不相关。

-(void)drawPolygon{

NSInteger numberOfCoordinates = path.count;
if(coords != NULL)
    free(coords);
coords = malloc(sizeof(CLLocationCoordinate2D) * numberOfCoordinates);

CLLocationCoordinate2D coordinates[numberOfCoordinates];
for(int pathIndex = 0; pathIndex < numberOfCoordinates; pathIndex++){
    CLLocation *location = [path objectAtIndex:pathIndex];
    coords[pathIndex] = location.coordinate;

    coordinates[pathIndex] = coords[pathIndex];
}

  polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
  polygon = [MKPolygon polygonWithCoordinates:coords count:path.count];
  [map addOverlay:polyLine];
}

//设置圆圈叠加

-(void)setPolygonAnnotationWithCoordinate:(CLLocationCoordinate2D)coord andWithTitle:(NSString *)polygonDescription{

    circle = [MKCircle circleWithCenterCoordinate:coord radius:15];
    circle.title = polygonDescription;
    [map addOverlay:circle];
    //[map addAnnotation:circle];
}

// MapView覆盖委托方法。有没有更好的方法来检查叠加?如果我有100个叠加怎么办

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

    if(overlay == circle){
        pointCircleView = [[MKCircleView alloc]initWithOverlay:overlay];
        pointCircleView.strokeColor = [UIColor greenColor];
        pointCircleView.fillColor = [UIColor redColor];
        //circleView.alpha = 0.5;
        pointCircleView.lineWidth = 4.0;
        return pointCircleView;
    }
    else if(overlay == polyLine){
        borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
        borderView.strokeColor = [UIColor blackColor];
        borderView.lineWidth = 1.0;
        return borderView;
    }
    else if(overlay == polygon){
        polygonView = [[MKPolygonView alloc] initWithPolygon:polygon];
        polygonView.strokeColor = [UIColor blackColor];
        polygonView.lineWidth = 1.0;
        polygonView.fillColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.0 alpha:0.4];
        return polygonView;
    }

}

1 个答案:

答案 0 :(得分:2)

对于闪烁,请参阅此post - 这可能是叠加系统中的错误。

使用锯齿状线条,它们在屏幕截图中看起来似乎是抗锯齿的,但可能已经放大了。从实验来看,我相信叠加会被渲染为单独的位图以用于离散缩放级别,然后在地图视图上按比例放大或缩小以适应当前缩放级别。因此,可能是您的叠加层在该级别看起来有点粗糙,但放大或缩小可以改善它。

关于委托,您可以检查传入的叠加层的类,以降低mapView:viewForOverlay函数的复杂性,而不是检查特定叠加层。所以:

if ([overlay isKindOfClass:[MKPolyline class]])
{
    borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
    borderView.strokeColor = [UIColor blackColor];
    borderView.lineWidth = 1.0;
    return borderView;
}