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