重写MKMapView drawMapRect方法返回错误

时间:2015-03-21 18:25:59

标签: ios objective-c xcode mkmapview mkoverlay

我覆盖了.m文件中的drawMapRect方法,但似乎重写方法中的某些代码行给了我错误,我不知道如何解决。我确保将mkmapview委托设置为self,导入了所有正确的包。这是drawMapRect方法的代码,

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{
CGRect rect = [self rectForMapRect:mapRect];
CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillRect(context, rect);
CGContextRestoreGState(context);

[super drawMapRect:mapRect zoomScale: zoomScale inContext:context];
}

第二行代码返回一个错误,“没有可见的'MapfaceClass'接口声明了'rectForMapRect:'的选择器

最后一行代码返回错误。 “'UIViewController'没有可见的@interface声明选择器'drawMapRect:zoomScale:inContext:'

修改 在查看Daji的答案后,我对我的代码进行了以下更改。我创建了一个新类,它是MKOverlayRenderer的子类,并将drawMapRect方法移动到该类。之前收到的错误现在已经消失,但是没有绘制叠加层。这是我的MapViewClass .m文件以及MKOverlayRenderer子类的附加代码。

#import "MapOverlayRenderer.h"

 @implementation MapOverlayRenderer
-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{
CGRect rect = [self rectForMapRect:mapRect];
CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillRect(context, rect);
CGContextRestoreGState(context);

[super drawMapRect:mapRect zoomScale: zoomScale inContext:context];
}
@end

MapViewClass .m

 - (void)viewDidLoad {
 mapView = [[MKMapView alloc]initWithFrame:CGRectMake(0, 75, 320, 493)];
 mapView.delegate = self;
 mapView.mapType = MKMapTypeStandard;
[self.view addSubview: mapView];
 MKMapRect worldRect = MKMapRectWorld;
 MKCoordinateRegion worldRegion =   MKCoordinateRegionForMapRect(worldRect);

  CLLocationCoordinate2D worldPoints[4];
//Creates corners of the whole map
  worldPoints[0] = CLLocationCoordinate2DMake(worldRegion.center.latitude +    worldRegion.span.latitudeDelta/2.0, worldRegion.center.longitude - worldRegion.span.longitudeDelta/2.0);
        worldPoints[1]= CLLocationCoordinate2DMake(worldRegion.center.latitude - worldRegion.span.latitudeDelta/2.0, worldRegion.center.longitude - worldRegion.span.longitudeDelta/2.0);
        worldPoints[2] = CLLocationCoordinate2DMake(worldRegion.center.latitude + worldRegion.span.latitudeDelta/2.0, worldRegion.center.longitude + worldRegion.span.longitudeDelta/2.0);
        worldPoints[3]= CLLocationCoordinate2DMake(worldRegion.center.latitude - worldRegion.span.latitudeDelta/2.0, worldRegion.center.longitude + worldRegion.span.longitudeDelta/2.0);

        MKPolygon *worldSquare = [MKPolygon polygonWithCoordinates:worldPoints count:4];

        [mapView addOverlay:worldSquare];
}

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{
if([overlay isKindOfClass:[MKPolygon class]]){
    MapOverlayRenderer *polygonView = [[MapOverlayRenderer alloc]initWithOverlay:overlay];

    return polygonView;
}
}

1 个答案:

答案 0 :(得分:1)

1

您将代码放入ViewController中 - 视图控制器不是地图视图:)

您的VC可能有地图视图,但它不是地图视图

2

但更重要的是:

代码也不属于mapView。您尝试使用地图叠加层。考虑使用MKOverlayRenderer


这两个错误消息基本上都是这样说的:

  1. 表示您的SELF(ViewController)没有名为rectForMapRect
  2. 的方法
  3. 表示您的SUPER(UIViewController)没有名为drawMapRect
  4. 的方法

    ==&GT;只有MKOverlayRenderer提供它们(如果您搜索这两种方法,则可从文档中看到)