iOS - MKOverlayView自定义视图矩形填充作品,但线条绘制不是

问题描述:

新的地图叠加,但这是一个非常奇怪的问题。iOS - MKOverlayView自定义视图矩形填充作品,但线条绘制不是

我将mapView.visibleMapRect传递给我的覆盖实现,并将其作为boundingMapRect返回,现在很好 - 只是试图在整个地图上绘制一条直线。

我的drawMapRect被调用,并在下面的代码中 - 部分透明的绿色矩形被绘制,但行不是。我已经验证了uiview子类的drawRect中的线条绘制代码,所以我知道它绘制了一些东西:-)

我确定我必须错过某件简单的东西,但我看不到它:-)

引发我兴趣的事情是,visibleMapRect在转换为CGRect时有非常奇怪的坐标 - 它们看起来不像我的屏幕坐标 - 这对我来说似乎是问题的根源。

任何帮助,将不胜感激:

的drawMapRect被多次调用,我附加以下的输出。

谢谢, 鲍勃

的ViewController设置代码:

CLLocationCoordinate2D center; 
center.latitude = 29.46; 
center.longitude = -98.30; 

MKCoordinateRegion region; 

MKCoordinateSpan span; 
span.latitudeDelta = 0.2; 
span.longitudeDelta = 0.2; 

region.center = center; 
region.span = span; 

self.mapView.region = region; 

MyOverlay *myoverlay = [[MyOverlay alloc] initWithCoordinate: center andBoundingRect: self.mapView.visibleMapRect]; 
[self.mapView addOverlay:myoverlay]; 

MyOverlay代码:

@implementation MyOverlay 

@synthesize coordinate; 
@synthesize boundingMapRect; 


- (id) initWithCoordinate: (CLLocationCoordinate2D) coord andBoundingRect: (MKMapRect) bRect { 

    if ((self = [super init])) { 
     //customize here 

     coordinate = coord; 
     boundingMapRect = bRect; 
    } 

    return self; 

} 

MyOverlayView绘图代码

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

    CGRect theRect = [self rectForMapRect:mapRect]; 

    NSLog(@"in drawMapRect ...theRect is %f, %f, size of %f x %f", theRect.origin.x, theRect.origin.y, theRect.size.width, theRect.size.height); 
    CGContextSetAlpha(context, 1.0); 
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
    CGContextMoveToPoint(context, theRect.origin.x, theRect.origin.y); 
    CGContextAddLineToPoint(context, theRect.size.width, theRect.size.width); 

    CGContextSetAlpha(context, .25); 
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); 
    CGContextFillRect(context, theRect); 

} 

输出

2011-05-16 11:25:18.037 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 61440.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.038 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 323584.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.042 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 323584.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.044 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -200704.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.046 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -200704.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.048 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 61440.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.052 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 323584.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.054 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 323584.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.056 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -200704.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.057 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -200704.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.059 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 61440.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.061 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 61440.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.063 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 323584.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.064 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 323584.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.066 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -200704.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.068 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -200704.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.070 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 585728.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.072 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 585728.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.074 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -462848.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.075 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -462848.000000, 37888.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.082 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 61440.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.082 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 585728.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.085 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 61440.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.087 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -462848.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.089 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -462848.000000, -224256.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.099 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 585728.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.102 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -462848.000000, 300032.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.106 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 323584.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.109 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -200704.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.111 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -200704.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.116 coolOverlayTest[71661:760b] in drawMapRect ...theRect is 585728.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.119 coolOverlayTest[71661:7903] in drawMapRect ...theRect is 585728.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.124 coolOverlayTest[71661:7903] in drawMapRect ...theRect is -462848.000000, -486400.000000, size of 262144.000000 x 262144.000000 
2011-05-16 11:25:18.126 coolOverlayTest[71661:760b] in drawMapRect ...theRect is -462848.000000, -486400.000000, size of 262144.000000 x 262144.000000 

问题是与线宽度的设定。在你的例子中,宽度没有设置。如果你仍然想解决这个问题,看看这里Custom MKOverlayView line width

需要考虑的一件事是,出于性能原因,在多个线程上调用drawMapRect:。这就解释了为什么你看到drawMapRect:被多次调用。此外,此方法的mapRect输入不一定等于可见的mapView.visibleMapRect。实际上mapRect通常是mapView.visibleMapRect的一小部分,不同的线程渲染了不同的区域mapView.visibleMapRect。因此,仅仅因为一个点包含在mapView.visibleMapRect之内,它并不意味着它包含在mapRect中传递给所有调用drawMapRect的结果。

您在调用CGContextAddLineToPoint时的坐标错误。您有:

CGContextMoveToPoint(context, theRect.origin.x, theRect.origin.y); 
CGContextAddLineToPoint(context, theRect.size.width, theRect.size.width); 

,但它应该是:

CGContextMoveToPoint(context, theRect.origin.x, theRect.origin.y); 
CGContextAddLineToPoint(context, theRect.origin.x + theRect.size.width, theRect.origin.y + theRect.size.height); 

至少如果你希望在你的矩形对角线画线。

另外,作为卢德维克波拉克上面提到的,你可能还需要设置线宽使用类似:

CGContextSetLineWidth(context, MKRoadWidthAtZoomScale(zoomScale));