मैं अंत में यह काम करने में सक्षम हूं। मैंने मैपबॉक्स परियोजना में एक उप-वर्गीकृत आरएममार्कर क्लास बनाया है और मैं सभी घटकों को कैलियर के रूप में जोड़ रहा हूं, 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);
}
}
}
आशा है कि यह किसी को, जो मार्कर/टिप्पणी बनाने करना चाहते हैं और अनेक कार्रवाइयों को चाहते हैं मदद करता है इस पर।
मैं awesomeMenu के साथ एक समान दृष्टिकोण को लागू करने में सक्षम था लेकिन मैं इसे निश्चित रूप से आजमाउंगा। धन्यवाद। – Felix