iOS – MKOverlayView自定义视图矩形填充工程,但线绘制不

新的地图叠加,但这是一个非常奇怪的问题。

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

我的drawMapRect被调用,并在下面的代码 – 部分透明的绿色矩形绘制,但行不是。 我已经validation了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 %fx %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 

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

问题在于设置线宽。 在你的例子中,宽度没有设置。 如果你仍然想解决这个问题,看看这里自定义MKOverlayView线宽 。

您在对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); 

至less如果你希望在你的矩形对angular线画一条线。

另外像上面提到的Ludvik Polak,你可能也需要使用类似的方法设置线宽:

 CGContextSetLineWidth(context, MKRoadWidthAtZoomScale(zoomScale));