我试图在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
在地图视图顶部显示图像?
答案 0 :(得分:2)
有几个问题:
通过调用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 = ...
在rendererForOverlay
中,代码正在创建MapOverlayRenderer
的实例,但未向其提供对基础overlay
模型对象的引用。改为呼叫initWithOverlay
:
MapOverlayRenderer *mapOverlay
= [[MapOverlayRenderer alloc] initWithOverlay:overlay];
顺便说一下,您可以使用注释更容易地将图像放在该位置(但是图像不会随着基于叠加层的图像的缩放级别缩放)。不确定你想要哪种功能。