我正在尝试学习MapKit,现在正尝试将图像添加为地图视图的叠加层。 我似乎无法找到任何示例代码来帮助解释如何执行此操作。
你们可以帮助我们如何创建MKOverlay
并将其添加到MKMapKit
。
提前致谢..
答案 0 :(得分:25)
以下是如何将UIImage
设置为MKMapView
叠加层的示例。一些参数(坐标和图像路径)是固定的,但我猜想代码可以很容易地改变。
创建符合MKOverlay
的类:
MapOverlay.h
@interface MapOverlay : NSObject <MKOverlay> {
}
- (MKMapRect)boundingMapRect;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@end
MapOverlay.m
@implementation MapOverlay
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate {
self = [super init];
if (self != nil) {
}
return self;
}
- (CLLocationCoordinate2D)coordinate
{
CLLocationCoordinate2D coord1 = {
37.434999,-122.16121
};
return coord1;
}
- (MKMapRect)boundingMapRect
{
MKMapPoint upperLeft = MKMapPointForCoordinate(self.coordinate);
MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, 2000, 2000);
return bounds;
}
@end
创建一个符合MKOverlayView的类:
MapOverlayView.h
@interface MapOverlayView : MKOverlayView {
}
@end
MapOverlayView.m
@implementation MapOverlayView
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)ctx
{
UIImage *image = [[UIImage imageNamed:@"image.png"] retain];
CGImageRef imageReference = image.CGImage;
MKMapRect theMapRect = [self.overlay boundingMapRect];
CGRect theRect = [self rectForMapRect:theMapRect];
CGRect clipRect = [self rectForMapRect:mapRect];
CGContextAddRect(ctx, clipRect);
CGContextClip(ctx);
CGContextDrawImage(ctx, theRect, imageReference);
[image release];
}
@end
将叠加层添加到MKMapView:
MapOverlay * mapOverlay = [[MapOverlay alloc] init];
[mapView addOverlay:mapOverlay];
[mapOverlay release];
在mapView委托上,实现viewForOverlay:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {
MapOverlay *mapOverlay = overlay;
MapOverlayView *mapOverlayView = [[[MapOverlayView alloc] initWithOverlay:mapOverlay] autorelease];
return mapOverlayView;
}
希望它有所帮助!
答案 1 :(得分:2)
文档:
示例代码:
答案 2 :(得分:0)
在搜索我的问题的解决方案时,我不断回到这个问题,here以及here
他们都在回答我需要回答的问题,但反之亦然。
我需要确定UIView,即我的MapView上的绘制方格是否包含地图引脚,如果它确实让我知道,那么我可以删除它或选择它等。
最后,在尝试将我的UIView转换为某些MKCoordinateRegion或类似之后,我认为向后工作。我没有将我的UIView或方块变成地图疯狂,而是将引脚转换为简单的CGPoints并做了一个简单的Rect包含点。最终成为我的解决方案......大约2小时后!
希望这有助于某人下线
func findMapPinsWithinBox() {
guard let myBox = myBox else { return } // some UIView you have drawn or placed on map
let visibleMapRect = mapView.visibleMapRect
let visibleAnnotations = mapView.annotationsInMapRect(visibleMapRect)
for pin in visibleAnnotations {
// depending on design you may need to do some casting here
// ie let pin = pin as! MyMapAnnotation
let pinsCGPoint = mapView.convertCoordinate(pin.coordinate, toPointToView: self.view)
if myBox.frame.contains(pinsCGPoint) {
print("Pin Found within the Box")
// select pin or delete etc
}
}
}
答案 3 :(得分:-1)