[英]MapBox add interactive annotation/view at location iOS
我正在嘗試實現MapBox地圖,使用它的特殊原因,它是高度可定制的,我需要創建一個具有所有不同顏色的不同類型的地圖,我得到了完美的工作。
問題我想在地圖上添加一個應該從內部交互的注釋,通常一個注釋是交互式的,只需點擊它就可以了,它有效,我需要注釋中的UIButton,點擊Button動作應該執行。
問題如何使用MapBox中的按鈕/視圖創建注釋,我應該如何處理。
任何幫助表示贊賞。
謝謝。
編輯:
更准確地說,我想要下面的圖像 用於注釋..
我終於可以讓這個工作了。 我在MapBox項目中創建了一個Subclassed RMMarker類,我將所有組件添加為CALayer,在UIView
添加組件,然后添加UIView.layer
不起作用。 您必須在UIView層中添加子圖層。
然后我創建了自定義委托來處理觸摸事件。
確保從這里使用MapBox並在MapBox項目中添加MyMarker作為組件。
我在這里添加我的代碼
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);
}
}
}
希望它可以幫助想要創建標記/注釋並希望對其進行多項操作的人。
為什么不簡單地使用- (void) singleTapOnMap:(RMMapView *)map at:(CGPoint)point
delegate? 我沒有看到你使用任何按鈕狀態,所以在我看來最簡單的方法是:
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!)
委托方法,並在按鈕點擊操作中執行您想要執行的操作。
在MapBox文檔中查看此示例: http : //www.mapbox.com/mapbox-ios-sdk/examples/callout-accessory-view/這與MapKit的工作方式非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.