objective-c - MKOverlayRenderer 在 map View 上显示 UIImage

标签 objective-c ios7 uiimage mapkit

我正在尝试在 iOS 7 中的 map View 上显示图像。

我将 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

我的 View Controller 中有以下内容,其中包含 map View :

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 将 map 缩放到某个位置时,我看不到 map View 顶部的图像。

如何使用 iOS 7 中的 MKOverlayRenderer 在 map View 上显示图像?

最佳答案

有几个问题:

  1. 通过调用 addOverlay 向 map 实际添加叠加层的代码在哪里? ?您需要创建一个类型为 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];
    


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

关于objective-c - MKOverlayRenderer 在 map View 上显示 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459940/

相关文章:

ios - NSURLRequestReloadIgnoringLocalAndRemoteCacheData 在 iOS 7 中工作吗?

objective-c - 如何调整 UIPageViewController 的横向大小

iphone - 如何获取 UIImage 并给它一个黑色边框?

performance - 带有大 UIImageView 的自定义 UITableViewCell 导致滚动延迟

iphone - 如何从我的应用程序访问 "Manage Subscriptions"

objective-c - 为我的类(class)采用/实现快速枚举的例子?

ios - 如何防止状态栏与我的应用重叠?

ios - 如何从 NSArray ios 中获取值

ios - 如何使用 NSDictionary 收集嵌套在数组中的 JSON 数据

iPhone - 获取锁屏背景图片