MKOverlayRenderer在地图视图上显示UIImage

时间:2013-12-08 22:23:09

标签: objective-c ios7 uiimage mapkit

我试图在iOS 7的地图视图上显示图片。

我将MKOverlayRenderer子类化如下:

MapOverlayRenderer.h

#import <Foundation/Foundation.h>
@import MapKit;

@interface MapOverlayRenderer : MKOverlayRenderer

@end

MapOverlayRenderer.m

#import "MapOverlayRenderer.h"

@implementation MapOverlayRenderer

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

    UIImage *image = [UIImage imageNamed:@"marker"];
    CGImageRef imageReference = image.CGImage;

    MKMapRect theMapRect = [self.overlay boundingMapRect];
    CGRect theRect = [self rectForMapRect:theMapRect];

    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextTranslateCTM(context, 0.0, -theRect.size.height);

    CGContextDrawImage(context, theRect, imageReference);
}

@end

我的视图控制器中包含以下地图视图:

ViewController.m

#import "ViewController.h"
#import "MapOverlayRenderer.h"
@import MapKit;

@interface ViewController () <MKMapViewDelegate>

@property (weak,nonatomic) IBOutlet MKMapView *mapView;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.mapView setDelegate:self];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {

    MapOverlayRenderer *mapOverlay = [[MapOverlayRenderer alloc] init];
    return mapOverlay;
}

- (IBAction)showSeattle:(id)sender {

    CLLocationCoordinate2D location = {47.61167908,-122.33325958};
    int radius = 100000; //radius in meters
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, radius, radius);
    [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];
}

@end

当调用IBAction将地图缩放到某个位置时,我看不到地图视图顶部的图像。

如何使用iOS 7中的MKOverlayRenderer在地图视图顶部显示图像?

1 个答案:

答案 0 :(得分:2)

有几个问题:

  1. 通过调用addOverlay,代码在哪里实际向地图添加了叠加层?您需要创建id<MKOverlay>类型的对象,并在addOverlay调用中传递它。您可以创建一个实现MKOverlay的自定义类,但在这种情况下,您只需使用MKCircle来表示图像的位置和大小。在showSeattle:方法中:

    CLLocationCoordinate2D location = {47.61167908,-122.33325958};
    int radius = 100000; //radius in meters
    
    MKCircle *c = [MKCircle circleWithCenterCoordinate:location radius:radius];
    [self.mapView addOverlay:c];
    
    MKCoordinateRegion region = ...
    
  2. rendererForOverlay中,代码正在创建MapOverlayRenderer的实例,但未向其提供对基础overlay模型对象的引用。改为呼叫initWithOverlay

    MapOverlayRenderer *mapOverlay 
        = [[MapOverlayRenderer alloc] initWithOverlay:overlay];
    

  3. 顺便说一下,您可以使用注释更容易地将图像放在该位置(但是图像不会随着基于叠加层的图像的缩放级别缩放)。不确定你想要哪种功能。