7

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

我想在地图上添加应该从内部交互的注释的问题,通常只需点击注释即可交互,它可以工作,我需要注释中的 UIButton 并单击应该执行的按钮操作。

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

任何帮助表示赞赏。

谢谢。

编辑:

更准确地说,我想要如下图所示在此处输入图像描述的注释。

4

4 回答 4

5

我终于能够完成这项工作。我在 MapBox 项目中创建了一个 Subclassed RMMarker 类,我将所有组件添加为 CALayer,添加组件UIView然后添加UIView.layer不起作用。您必须在 UIView 层中添加子层。

然后我创建了自定义委托来处理触摸事件。

确保从此处使用 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); 
        } 

    }

}

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

于 2013-11-11T14:18:57.843 回答
1

为什么不简单地使用- (void) singleTapOnMap:(RMMapView *)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")
        }
    }
于 2015-04-02T14:36:06.817 回答
0

您还可以使用:

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

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

于 2015-04-15T13:08:27.063 回答
-1

在 MapBox 文档中查看此示例:http: //www.mapbox.com/mapbox-ios-sdk/examples/callout-accessory-view/这与 MapKit 非常相似。

于 2013-10-02T07:22:59.433 回答