Как создать наложение изображений и добавить в MKMapView?
Я пытаюсь изучить MapKit, и теперь я пытаюсь добавить изображение в качестве наложения в представление карты.
Я не могу найти какой-либо пример кода, чтобы объяснить, как это сделать.
Можете ли вы, ребята, помочь мне создать MKOverlay
и добавить их в MKMapKit
.
Спасибо заранее.
Ответы
Ответ 1
Вот пример того, как установить наложение 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;
}
Надеюсь, что это поможет!
Ответ 2
Документация:
Пример кода:
Ответ 3
В поисках решения моей проблемы, я продолжаю возвращаться к этому вопросу, и здесь, а также здесь
Все они отвечали на вопрос, который мне нужен, но наоборот.
Мне нужно было определить, имеет ли UIView, т.е. квадрат draw на моем 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
}
}
}
Ответ 4
Просто глядя на документацию Apple для протокола MKOverlay
, он выглядит не очень сложным. Просто сделайте класс, чтобы сделать все, что вам нужно, для вычисления наложения и убедитесь, что он соответствует этому протоколу. Это означает, что у вас должны быть свойства coordinate
и boundingMapRect
, а также реализация для intersectsMapRect:
. Все документы Apple объясняют.
Взгляните на образец HazardMap от Apple. Он использует настраиваемое оверлейное представление, которое вы хотите сделать, чтобы отобразить изображение в оверлее. Вам просто нужно реализовать mapView:viewForOverlay:
в вашем классе MKMapViewDelegate
и вернуть новый экземпляр вашего подкласса MKOverlayView
, чтобы получить пользовательский оверлей, нарисованный на экране.