2013-10-01 11 views
7

Sto cercando di implementare mappe MapBox, un motivo speciale per utilizzarlo, è altamente personalizzabile, ho bisogno di creare un diverso tipo di mappa con tutti i colori diversi, ho capito che funziona perfettamente bene.MapBox aggiunge annotazione interattiva/vista alla posizione iOS

Il problema che voglio aggiungere all'annotazione sulla mappa che deve essere interattivo dall'interno, normalmente un'annotazione è interattiva semplicemente toccandola, funziona, ho bisogno di qualcosa come un UIButton nell'annotazione e facendo clic sull'azione del pulsante dovrei eseguire .

Domanda Come creare un'annotazione con un pulsante/vista in MapBox, come dovrei avvicinarmi.

Qualsiasi aiuto è apprezzato.

Grazie.

Edit:

Per essere più precisi voglio qualcosa come l'immagine qui sotto enter image description here per l'annotazione ..

risposta

5

Sono finalmente in grado di farlo funzionare. Ho creato una classe RMMarker sottoclasse in Progetto MapBox e sto aggiungendo tutti i componenti come CALayer, aggiungendo componenti in UIView quindi l'aggiunta di UIView.layer non funziona. Devi aggiungere sottolivelli nel livello UIView.

Quindi ho creato i delegati personalizzati per gestire gli eventi touch.

Assicurarsi di utilizzare MapBox da here e aggiungere MyMarker all'interno del progetto MapBox come componente.

Sto aggiungendo il mio codice qui

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.m

Aggiunto BOOL _delegateHasMyMarkerDelegate;

delegato Setup proprietà del metodo

- (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]]; 

    } 

} 

attuazione

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

    } 

} 

Speranza che aiuta qualcuno, che vogliono creare Marker/annotazione e vogliono più azioni sopra.

+0

Sono stato in grado di implementare un approccio simile con awesomeMenu, ma ci proverò sicuramente. Grazie. – Felix

1

Perché non utilizzare semplicemente il delegato - (void) singleTapOnMap:(RMMapView *)map at:(CGPoint)point? Non vedo si utilizzano stati del pulsante, quindi mi sembra il modo più semplice è:

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

È piuttosto vecchio, ma non hai letto correttamente il requisito, suppongo che, utilizzando la funzione precedente, consentirò di selezionare l'intera annotazione, il mio requisito era di progettare una singola annotazione con più azioni al suo interno, sarò felice che tu aggiunga risposta più corretta ad esso. Potrebbe essere 'MapBox' sono migliorati con il tempo, non lo seguo da molto tempo. Ho contribuito con la mia soluzione a MapBox, anche loro l'hanno accettato. – iphonic

0

È anche possibile utilizzare:

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

metodo delegato, e fare le cose che volevi fare nel pulsante toccato azione.

+0

NO, su didSelectAnnotation, vengono visualizzati i pulsanti. I pulsanti sono aggiunti nell'annotazione. – iphonic

+0

Ah scusa, ho frainteso la tua domanda. Ma invece di aggiungere i pulsanti nell'annotazione, non potresti semplicemente aggiungerli alla superview e impaginarli in base alla posizione dell'annotazione? Presumo che quei pulsanti verranno visualizzati per ogni annotazione. In questo modo avresti potuto evitare i livelli e le cose, * ((MyMarker) [[superlayer superlayer] superlayer] * non buono) e implementare semplicemente le azioni dei pulsanti nel tuo controller di visualizzazione. E potresti ottenere il punto di annotazione con: * self.mapView.coordinateToPixel (annotation.coordinate) * – berilcetin

+0

NO, anche questo non è possibile in quanto MapBox usa CALayer per le sue implementazioni, non per UIView, altrimenti sarebbe stato fatto come hai detto tu . – iphonic