我在我的地图上绘制了一个图像作为叠加层(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
叠加视图.h
#import <MapKit/MapKit.h>
@interface PVParkMapOverlayView : MKOverlayRenderer
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage;
@end
叠加视图.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
我将它添加到地图中,如下所示:
主视图控制器
- (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 的示例,但无济于事。我是否应该使用切口的位置数据创建一条不可见的(对用户而言)折线并检查它?似乎应该有一种方法可以更有效地捕捉覆盖,不是吗?