Ios 添加新覆盖时,MKMapView覆盖重绘(闪烁)。多段线是锯齿状的

Ios 添加新覆盖时,MKMapView覆盖重绘(闪烁)。多段线是锯齿状的,ios,mkmapview,mapkit,mkpolygon,Ios,Mkmapview,Mapkit,Mkpolygon,我正在MKMapView上测试一些基本的绘图功能,我发现一些奇怪的事情发生了。您可以参考下面的dropbox链接。这是在实际设备上运行和测试的,而不是在模拟器上 您会注意到,有些MKpolyline是锯齿状的,因为它们是连接的,有些则不是。这是什么原因,可以纠正吗?我没有看到任何设置抗锯齿的选项。最右边的多边形我想你能看到的最多。但总的来说,有些线条似乎比其他线条更平滑 这个屏幕截图没有显示的另一件事是,每次我点击视图添加一个新的覆盖图时,地图上的所有覆盖图都会“闪烁”,好像它们正在被重新绘制或

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

您会注意到,有些MKpolyline是锯齿状的,因为它们是连接的,有些则不是。这是什么原因,可以纠正吗?我没有看到任何设置抗锯齿的选项。最右边的多边形我想你能看到的最多。但总的来说,有些线条似乎比其他线条更平滑

这个屏幕截图没有显示的另一件事是,每次我点击视图添加一个新的覆盖图时,地图上的所有覆盖图都会“闪烁”,好像它们正在被重新绘制或者可能没有被足够快地重新绘制。我想知道这是什么原因,或者也许我应该做些别的事情来防止这件事发生,我不知道

还有一个关于代表的问题。如果你的地图上有100个不同的覆盖图呢?您是否应该对代理中的每个人进行检查,以告知其要执行哪种绘图?在我的例子中,只有3个例子,但我可以想象这个方法会变得非常大,我在这里设置。我知道这是一个旁敲侧击的问题,但我想我会把它插入这里

以下是相关代码:

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

}
-(MKOverlayView*)地图视图:(MKMapView*)地图视图覆盖:(id)覆盖{
如果(覆盖==圆){
pointCircleView=[[MKCircleView alloc]initWithOverlay:overlay];
pointCircleView.strokeColor=[UIColor greenColor];
pointCircleView.fillColor=[UIColor redColor];
//circleView.alpha=0.5;
pointCircleView.lineWidth=4.0;
返回点CircleView;
}
else if(叠加==多段线){
borderView=[[MKPolylineView alloc]initWithPolyline:overlay];
borderView.strokeColor=[UIColor blackColor];
borderView.lineWidth=1.0;
返回边界视图;
}
else if(叠加==多边形){
polygonView=[[MKPolygonView alloc]initWithPolygon:polygon];
polygonView.strokeColor=[UIColor blackColor];
polygonView.lineWidth=1.0;
polygonView.fillColor=[uicolorWithred:1.0绿色:1.0蓝色:0.0 alpha:0.4];
返回polygonView;
}
}

有关闪烁的信息,请参见此-可能是叠加系统中的错误

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

关于委托,您可以检查传入的覆盖的类,以降低
mapView:viewForOverlay
函数的复杂性,而不是检查特定的覆盖。因此:

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

谢谢你提醒我关于代表的事情。我刚刚进入MapKit,所以我对这个特定的API是新手。看起来覆盖系统中的iOS6中确实存在一个bug。对于iOS5来说,似乎没有问题。
if ([overlay isKindOfClass:[MKPolyline class]])
{
    borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
    borderView.strokeColor = [UIColor blackColor];
    borderView.lineWidth = 1.0;
    return borderView;
}