gpt4 book ai didi

ios - MapBox 在 iOS 位置添加交互式注释/ View

转载 作者:可可西里 更新时间:2023-11-01 03:31:45 26 4
gpt4 key购买 nike

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

我想在 map 上添加应该从内部交互的注释的问题,通常注释是通过点击它进行交互的,它有效,我需要在注释中使用类似 UIButton 的东西,然后单击 Button 操作应该执行。

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

感谢任何帮助。

谢谢。

编辑:

更准确地说,我想要类似下图的东西 enter image description here用于注释..

最佳答案

我终于能够让它工作了。我在 MapBox 项目中创建了一个子类 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;

设置委托(delegate)方法属性

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

}

}

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

关于ios - MapBox 在 iOS 位置添加交互式注释/ View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com