2013-10-01 87 views
7

我想實現MapBox地圖,使用它的特殊原因,它是高度可定製的,我需要創建一種不同種類的地圖,使用所有不同的顏色,我得到了完美的工作精細。MapBox在位置添加交互式註釋/視圖iOS

問題我想在地圖上添加註釋,應該從內部交互,通常註釋是交互式的,只需點擊它,它的工作原理,我需要類似註釋中的UIButton和點擊按鈕操作應執行。

問題 如何使用MapBox中的按鈕/視圖創建註釋,我應該如何處理。

任何幫助表示讚賞。

謝謝。

編輯:

更精確我想類似下面enter image description here用於註釋圖像..

回答

5

我終於可以得到這個工作。我在MapBox項目中創建了一個Subclassed RMMarker類,我將所有組件添加爲CALayer,在UIView中添加組件,然後添加UIView.layer不起作用。您必須在UIView圖層中添加子圖層。

然後我創建了自定義代理來處理觸摸事件。

請確保您使用here的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]; 

     [email protected]"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。米

新增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); 
     } 

    } 

} 

希望它可以幫助別人,誰想要創建標記/註釋,並希望多個動作超過它。

+0

我可以用awesomeMenu實現一個類似的方法,但我會嘗試這一點。謝謝。 – Felix

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") 
     } 
    } 
+0

它雖然很古老,但你沒有正確閱讀要求我猜,使用上述功能將允許選擇整個註釋,我的要求是設計一個單一的註釋與多個動作,我會很高興你添加更正確的答案。可能'MapBox'隨着時間的推移有所改善,我沒有長期跟隨它。我爲MapBox貢獻了我的解決方案,他們也接受了它。 – iphonic

0

您還可以使用:

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

委託方法,做你想做的東西在按鈕點擊動作。

+0

否,在didSelectAnnotation上,出現按鈕。這些按鈕將添加到註釋中。 – iphonic

+0

對不起,我誤解了你的問題。但是,不是在註釋中添加按鈕,你可以將它們添加到超級視圖並根據註釋位置進行佈局嗎?我假設這些按鈕將顯示每個註釋。這樣你就可以避免圖層和東西,*((MyMarker)[[superlayer superlayer] superlayer] *不好),只需在視圖控制器中實現按鈕操作。你可以通過以下方式獲得註釋點:* self.mapView.coordinateToPixel(annotation.coordinate)* – berilcetin

+0

不,這也不可能,因爲MapBox使用CALayer來實現它,而不是UIView,否則它會像你說的那樣完成。 – iphonic