iOS - MKOverlayView自定义视图rect填充工作,但线条绘制不工作

时间:2011-05-16 21:56:34

标签: ios ios4 mkmapview mkoverlay

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

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

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

我确信我一定会错过一些简单的东西,但我看不到它: - )

让我失望的是,当转换为CGRect时,visibleMapRect具有非常奇怪的坐标 - 它们看起来根本不像我的屏幕坐标 - 这对我来说似乎是问题的根源。 p>

非常感谢任何帮助:

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

问题在于设置线宽。在您的示例中,未设置宽度。如果您仍想解决此问题,请查看此处Custom MKOverlayView line width

答案 2 :(得分:0)

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

至少如果您希望在矩形的对角线上画一条线。

同样如上面提到的Ludvik Polak,您可能还需要使用以下内容设置线宽:

CGContextSetLineWidth(context, MKRoadWidthAtZoomScale(zoomScale));