MKOverlayRenderer 在地图视图上显示 UIImage

2024-04-05

我正在尝试在 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

我的视图控制器中有以下内容,其中包含地图视图:

视图控制器.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调用将地图缩放到某个位置,我在地图视图顶部看不到图像。

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


有几个问题:

  1. 通过调用实际向地图添加叠加层的代码在哪里addOverlay?您需要创建一个类型的对象id<MKOverlay>并将其传递到addOverlay称呼。你could创建一个自定义类来实现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. In rendererForOverlay,代码正在创建一个实例MapOverlayRenderer但没有给它一个底层的引用overlay模型对象。称呼initWithOverlay反而:

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MKOverlayRenderer 在地图视图上显示 UIImage 的相关文章

随机推荐