MapBox在位置iOS添加交互式注释/视图

MapBox在位置iOS添加交互式注释/视图,ios,objective-c,map,annotations,mapbox,Ios,Objective C,Map,Annotations,Mapbox,我正在尝试实现MapBox地图,使用它的特殊原因是,它具有高度的可定制性,我需要创建一种具有所有不同颜色的不同类型的地图,我的工作非常好 我想在地图上添加注释的问题应该是从内部交互的,通常注释是通过点击它来交互的,它可以工作,我需要类似于注释中的UIButton的东西,并单击按钮操作应该执行 问题 如何使用MapBox中的按钮/视图创建注释,我应该如何处理 感谢您的帮助 谢谢 编辑: 更准确地说,我想要下面的图像作为注释。看看MapBox文档中的这个示例:它的工作原理与MapKit非常类似 我终

我正在尝试实现MapBox地图,使用它的特殊原因是,它具有高度的可定制性,我需要创建一种具有所有不同颜色的不同类型的地图,我的工作非常好

我想在地图上添加注释的问题应该是从内部交互的,通常注释是通过点击它来交互的,它可以工作,我需要类似于注释中的UIButton的东西,并单击按钮操作应该执行

问题 如何使用MapBox中的按钮/视图创建注释,我应该如何处理

感谢您的帮助

谢谢

编辑:


更准确地说,我想要下面的图像作为注释。

看看MapBox文档中的这个示例:它的工作原理与MapKit非常类似

我终于可以让它工作了。我已经在MapBox项目中创建了一个子类RMMarker类,我将所有组件添加为CALayer,在
UIView
中添加组件,然后添加
UIView.layer
不起作用。必须在UIView层中添加子层

然后我创建了come自定义代理来处理触摸事件

确保使用MapBox from并将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
实施

-(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); 
        } 

    }

}

希望它能帮助那些想要创建标记/注释并希望在其上执行多个操作的人。

为什么不简单地使用
-(void)singleTapOnMap:(rmmappview*)map at:(CGPoint)point
委托?我没有看到您使用任何按钮状态,因此在我看来,最简单的方法是:

func singleTapOnMap(map: RMMapView!, at point: CGPoint) {
        let layer = someObject.layer
        let frameOnScreen = layer.superlayer.convertRect(layer.frame, toLayer: map.layer)

        if CGRectContainsPoint(frameOnScreen, point) {
            NSLog("hit")
        }
    }
您还可以使用:

func mapView(mapView: RMMapView!, didSelectAnnotation annotation: RMAnnotation!)

委托方法,并在按钮点击操作中执行您想要执行的操作

谢谢@incaus,但上面的链接并不能解决我的问题。我可以用awesomeMenu实现类似的方法,但我一定会尝试。谢谢。虽然很旧,但你没有正确阅读要求。我想,使用上述功能可以选择整个注释,我的要求是设计一个注释,其中包含多个操作,我很高兴你能为其添加更多正确的答案。可能是
MapBox
随着时间的推移有所改进,我不会长期关注它。我把我的解决方案贡献给了MapBox,他们也接受了。不,在didSelectAnnotation上,按钮出现了。按钮是在注释中添加的。啊,对不起,我误解了你的问题。但是,您不能将按钮添加到superview中,并根据注释位置进行布局,而不是在注释中添加按钮吗?我假设每个注释都会显示这些按钮。通过这种方式,您可以避免图层和其他内容((MyMarker)[[superlayer superlayer]superlayer]不好),只需在视图控制器中实现按钮操作。你可以通过self.mapView.coordinateToPixel(annotation.coordinate)获得注释点不,这也是不可能的,因为MapBox使用CALayer来实现它,而不是UIView,否则它会像你说的那样完成。不,我的意思是你可以把按钮添加到MapBox的超级视图中。这肯定是一个UIVIEW是的,我理解,你是说直接添加到地图上,如果放大/缩小,可能会产生布局问题,我不确定,虽然这是一个非常老的问题,当时尝试了很多东西,但都记不清了,想出了这个解决方案当然,它可以优化。
func mapView(mapView: RMMapView!, didSelectAnnotation annotation: RMAnnotation!)