我正在尝试实现MapBox map ,这是使用它的特殊原因,它是高度可定制的,我需要创建具有所有不同颜色的另一种 map ,我认为它工作得很好。
我想在 map 上添加应该从内部进行交互的注释的问题,通常,只需轻按即可在注释上进行交互,它可以工作,我需要在注释中添加UIButton之类的东西,然后单击Button Action 即可执行。
问题
如何在MapBox中使用按钮/ View 创建注释,该如何处理。
任何帮助表示赞赏。
谢谢。
编辑:
为了更精确,我想要像下面的图像那样的注释。
最佳答案
我终于可以使它工作了。我在MapBox Project中创建了Subclassed RMMarker类,并且将所有组件添加为CALayer,在UIView
中添加了组件,然后添加了UIView.layer
不起作用。您必须在UIView层中添加子层。
然后,我创建了自定义委托(delegate)来处理触摸事件。
确保使用here中的MapBox,并将MyMarker作为组件添加到MapBox项目中。
我在这里添加我的代码
MyMarker.h
#import "RMMarker.h"
@interface MyMarker : RMMarker
@end
MyMarker.m
@implementation MyMarker
-(id)init{
self=[super init];
if(self){
UIView *subLayer=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 126, 91)];
UIView *smallView=[[UIView alloc] initWithFrame:CGRectMake(36.0, 0, 88, 91)];
//smallView.contents=(id)image;
[subLayer.layer addSublayer:smallView.layer];
subLayer.backgroundColor=[UIColor blueColor];
subLayer.layer.name=@"Annotation";
[self addSublayer:smallView.layer];
float y=11.0;
float x=12.0;
for(int i=0;i<4;i++){
CGPoint pt=CGPointMake(x, y);
UIView *handle=[self createHandle:@"Handle" fromPos:pt];
y=y+14.0;
handle.layer.name=[NSString stringWithFormat:@"Handle at %@",NSStringFromCGPoint(pt)];
[self addSublayer:handle.layer];
}
}
return self;
}
-(UIView *)createHandle:(NSString *)handle fromPos:(CGPoint)pos{
UIView *view=[[UIView alloc] initWithFrame:CGRectMake(pos.x, pos.y, 60.0, 5.0)];
view.backgroundColor=[UIColor brownColor];
return view;
}
@end
RMMapViewDelegate.h
- (void)tapOnMarker:(MyMarker *)marker at:(CGPoint )pt;
RMMapView.m
添加了
BOOL _delegateHasMyMarkerDelegate;
设置代理方法属性
- (void)setDelegate:(id <RMMapViewDelegate>)aDelegate{
_delegateHasMyMarkerDelegate=[_delegate respondsToSelector:@selector(tapOnMarker:at:)];
}
- (void)tapOnMarker:(MyMarker *)marker at:(CGPoint)aPoint
{
if (_delegateHasMyMarkerDelegate)
{
[_delegate tapOnMarker:marker at:aPoint];
}
}
- (void)handleSingleTap:(UIGestureRecognizer *)recognizer{
//Default initializers
CALayer *superlayer = [hit superlayer];
// See if tap was on an annotation layer or marker label and send delegate protocol method
//Added conditions for MyMarker touch events
if ([superlayer superlayer] != nil && [[superlayer superlayer] isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)[superlayer superlayer]) at:[recognizer locationInView:self]];
}else if ([[superlayer superlayer] superlayer] != nil && [[[superlayer superlayer] superlayer] isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)[[superlayer superlayer] superlayer]) at:[recognizer locationInView:self]];
}else if (superlayer != nil && [superlayer isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)superlayer) at:[recognizer locationInView:self]];
}
}
实现
-(RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation{
if(annotation.isUserLocationAnnotation)
return nil;
MyMarker *marker=[[MyMarker alloc] init];
[marker setFrame:CGRectMake(0, 0, 126, 91)];
return marker;
}
#pragma mark MyMarker Delegate
-(void)tapOnMarker:(MyMarker *)marker at:(CGPoint)pt{
for (CALayer *layer in marker.sublayers) {
CGPoint convertedPt=[[marker superlayer] convertPoint:pt toLayer:layer];
if([layer containsPoint:convertedPt]){
NSLog(@"%@ selected",layer.name);
}
}
}
希望它对希望创建标记/注释并希望对其执行多项操作的人员有所帮助。