2013-10-01 10 views
7

मै मैपबॉक्स मानचित्र को लागू करने की कोशिश कर रहा हूं, इसका उपयोग करने के लिए विशेष कारण है, यह अत्यधिक अनुकूलन योग्य है, मुझे सभी अलग-अलग रंगों के साथ एक अलग प्रकार का नक्शा बनाने की ज़रूरत है, मुझे यह मिल गया है कि यह पूरी तरह से काम कर रहा है ठीक।मैपबॉक्स स्थान पर इंटरैक्टिव एनोटेशन/व्यू जोड़ें IOS

समस्या मैं मानचित्र पर एनोटेशन जोड़ना चाहता हूं, जिसमें से इंटरैक्टिव होना चाहिए, आम तौर पर एक एनोटेशन केवल उस पर टैप करके इंटरैक्टिव होता है, यह काम करता है, मुझे एनोटेशन में UIButton की तरह कुछ चाहिए और बटन कार्रवाई पर क्लिक करना चाहिए ।

प्रश्न मैपबॉक्स में बटन/व्यू के साथ एनोटेशन कैसे बनाएं, मुझे कैसे संपर्क करना चाहिए।

किसी भी मदद की सराहना की जाती है।

धन्यवाद।

संपादित करें:

अधिक सटीक मैं टिप्पणी के लिए enter image description here नीचे दी गई छवि की तरह कुछ चाहते हो के लिए ..

उत्तर

5

मैं अंत में यह काम करने में सक्षम हूं। मैंने मैपबॉक्स परियोजना में एक उप-वर्गीकृत आरएममार्कर क्लास बनाया है और मैं सभी घटकों को कैलियर के रूप में जोड़ रहा हूं, UIView में घटकों को जोड़कर UIView.layer जोड़ना काम नहीं करता है। आपको UIView परत में sublayers जोड़ना होगा।

तब मैंने स्पर्श कार्यक्रमों को संभालने के लिए कस्टम प्रतिनिधि बनने के लिए तैयार किया है।

सुनिश्चित करें कि आप here से मैपबॉक्स का उपयोग करें और मैपबॉक्स परियोजना के अंदर 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

MapBox दस्तावेज में इस उदाहरण पर एक नज़र डालें: http://www.mapbox.com/mapbox-ios-sdk/examples/callout-accessory-view/ यह MapKit बिल्कुल उसी प्रकार से काम करता है ।

+0

धन्यवाद @incanus, लेकिन उपरोक्त लिंक मेरे उद्देश्य को हल नहीं करता है। – iphonic

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

हालांकि यह काफी पुराना है, लेकिन आपने सही ढंग से आवश्यकता को नहीं पढ़ा है, उपरोक्त फ़ंक्शन का उपयोग करके संपूर्ण एनोटेशन का चयन करने की अनुमति होगी, मेरी आवश्यकता एक ही एनोटेशन को कई क्रियाओं के साथ डिजाइन करना था, मैं आपको खुश करूंगा इसके लिए अधिक सही जवाब। हो सकता है कि समय के साथ 'मैपबॉक्स' में सुधार हो, मैं लंबे समय से इसका पालन नहीं कर रहा हूं। मैंने मैपबॉक्स में अपना समाधान दिया था, उन्होंने भी इसे स्वीकार कर लिया। – iphonic

0

तुम भी उपयोग कर सकते हैं:

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

प्रतिनिधि विधि, और सामान आप क्या करना चाहते थे करने के बटन में कार्रवाई टैप किया।

+0

नहीं, किया गया चयन करें, बटन दिखाई देते हैं। बटन एनोटेशन में जोड़े गए हैं। – iphonic

+0

आह क्षमा करें, मैंने आपके प्रश्न को गलत समझा। लेकिन एनोटेशन में बटन जोड़ने की बजाय, क्या आप उन्हें पर्यवेक्षण में जोड़ नहीं सकते और उन्हें एनोटेशन स्थिति के अनुसार लेआउट नहीं कर सकते? मुझे लगता है कि वे बटन प्रत्येक एनोटेशन के लिए दिखाए जाएंगे। इस तरह आप परतों और सामान से बच सकते हैं, * ((माईमार्कर) [[सुपरलेयर सुपरलेयर] सुपरलेयर] * अच्छा नहीं) और बस अपने व्यू कंट्रोलर में बटन क्रियाएं लागू करें। और आप एनोटेशन के बिंदु को प्राप्त कर सकते हैं: * self.mapView.coordinateToPixel (annotation.coordinate) * – berilcetin

+0

नहीं, यह भी संभव नहीं है क्योंकि मैपबॉक्स अपने कार्यान्वयन के लिए कैलियर का उपयोग करता है, यूआईवीव नहीं, अन्यथा ऐसा होता जैसा आपने कहा था । – iphonic

संबंधित मुद्दे