【问题标题】:MKOverlayRenderer to display UIImage over map viewMKOverlayRenderer 在地图视图上显示 UIImage
【发布时间】:2013-12-08 22:23:08
【问题描述】:

我正在尝试在 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 在地图视图上显示图像?

【问题讨论】:

    标签: objective-c ios7 uiimage mapkit


    【解决方案1】:

    有几个问题:

    1. 通过调用addOverlay 向地图添加叠加层的代码实际在哪里?您需要创建一个id&lt;MKOverlay&gt; 类型的对象并将其传递给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];
      


    顺便说一句,您可以使用注释更轻松地将图像放置在该位置(但图像不会像基于叠加的图像那样随缩放级别缩放)。不确定您想要哪种功能。

    【讨论】:

    • 不使用圆形覆盖,可以使用像矩形这样的多边形吗?
    • 是的,任何提供 MapOverlayRenderer 所需数据的覆盖类型都可以。我使用 MKCircle 是因为它最容易创建。
    • 另外,请参阅我与MKOverlayRendererstackoverflow.com/questions/20558591/…相关的其他问题
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 2014-01-05
    • 2011-09-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多