Как обнаружить прикосновение к непрозрачным частям оверлейного изображения, нарисованного MKOverlayRenderer

Я рисую изображение на своей карте в виде наложения (пример кода RW):

У него есть прозрачная часть посередине (которая должна пропускать прикосновения) и непрозрачные стороны, которые должны улавливать прикосновения (вроде бублика :)).

Оверлей.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@class PVPark;
@interface PVParkMapOverlay : NSObject <MKOverlay>
- (instancetype)initWithPark:(PVPark *)park;
@end

Оверлей.m

#import "PVParkMapOverlay.h"
#import "PVPark.h"
 @implementation PVParkMapOverlay
@synthesize coordinate;
@synthesize boundingMapRect;
- (instancetype)initWithPark:(PVPark *)park {
self = [super init];
if (self) {
    boundingMapRect = park.overlayBoundingMapRect;
    coordinate = park.midCoordinate;
}
return self;
}
@end

OverlayView.h

#import <MapKit/MapKit.h>
@interface PVParkMapOverlayView : MKOverlayRenderer
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage;
@end

OverlayView.m

#import "PVParkMapOverlayView.h"
@interface PVParkMapOverlayView ()
@property (nonatomic, strong) UIImage *overlayImage;
@end
@implementation PVParkMapOverlayView
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage {
self = [super initWithOverlay:overlay];
if (self) {
    _overlayImage = overlayImage;
}

return self;
}
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
CGImageRef imageReference = self.overlayImage.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

Я добавляю его на карту следующим образом:

MainViewController

- (void) viewDidLoad
{
[super viewDidLoad];
[self addOverlay];
}

- (void)addOverlay {
PVParkMapOverlay *overlay = [[PVParkMapOverlay alloc] initWithPark:self.park];
[self.mapView addOverlay:overlay];
}



- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
if ([overlay isKindOfClass:PVParkMapOverlay.class]) {
    UIImage *magicMountainImage = [UIImage imageNamed:@"overlay_park"];
    PVParkMapOverlayView *overlayView = [[PVParkMapOverlayView alloc] initWithOverlay:overlay overlayImage:magicMountainImage];

    return overlayView;
}
return nil;
}

Как я могу обнаружить прикосновение к непрозрачной части наложенного изображения? Я пытался использовать некоторые примеры с использованием MKPolyLines, но безрезультатно. Должен ли я создать невидимую (для пользователя) полилинию, используя данные о местоположении выреза, и проверить это? Кажется, должен быть способ более эффективно ловить оверлей, не так ли?


person BossBols    schedule 16.12.2014    source источник
comment
Я думаю, что создание невидимой полилинии (на самом деле многоугольника) и проверка того, находится ли точка в многоугольнике является наиболее эффективным и практичным способом (особенно если вы знаете координаты области). См. stackoverflow.com/questions/25835985/.   -  person    schedule 16.12.2014
comment
Спасибо за образец. Это, безусловно, вариант, но среднее прозрачное отверстие очень волнистое и редко с прямыми линиями, поэтому для получения всех этих координат потребуется много времени, чтобы сделать все правильно. Или есть простой и быстрый способ получить все эти точки на Картах?   -  person BossBols    schedule 17.12.2014