我正在尝试实现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);
        }

    }

}

希望它对希望创建标记/注释并希望对其执行多项操作的人员有所帮助。

07-28 03:52
查看更多