कैसे MKAnnotationView के लिए कॉल आउट बुलबुला अनुकूलित करने के लिए?

वोट
87

मैं वर्तमान में MapKit के साथ काम कर रहा हूँ और अटक कर रहा हूँ।

मैं एक कस्टम एनोटेशन दृश्य मैं उपयोग कर रहा हूँ, और मैं अपने खुद के आइकन के साथ मानचित्र पर बिंदु प्रदर्शित करने के लिए छवि संपत्ति का उपयोग करना चाहते। मैं इस काम कर ठीक किया है। लेकिन क्या मैं भी करना चाहते हैं डिफ़ॉल्ट कॉल आउट दृश्य (बुलबुला कि शीर्षक / उपशीर्षक जब एनोटेशन आइकन स्पर्श के साथ दिखाई देता) ओवरराइड करने के लिए है। मैं कॉल आउट खुद को नियंत्रित करने में सक्षम होना चाहते: MapKit केवल बाएँ और दाएँ सहायक कॉलआउट बार देखा गया है, लेकिन कोई रास्ता नहीं कॉलआउट बुलबुला के लिए एक कस्टम दृश्य प्रदान करने के लिए है, या यह शून्य आकार, या कुछ और देने के लिए उपलब्ध कराता है।

मेरा विचार मेरे में selectAnnotation / deselectAnnotation ओवरराइड करने के लिए था MKMapViewDelegate, और उसके बाद अपने कस्टम एनोटेशन देखने के लिए कॉल करके अपने खुद के कस्टम दृश्य आकर्षित। यह काम करता है, लेकिन केवल जब canShowCalloutके लिए सेट है YESअपने कस्टम एनोटेशन दृश्य कक्षा में। इन विधियों नहीं कहा जाता है कि अगर मैं करने के लिए इस सेट है NO(जो है जो मैं चाहता है, ताकि डिफ़ॉल्ट कॉल आउट बुलबुला तैयार नहीं है)। इसलिए मैं अगर उपयोगकर्ता के नक्शे पर मेरी बात को छुआ जानने का कोई तरीका नहीं है (यह चयनित) या एक मुद्दा यह है कि मेरी टिप्पणी के विचारों का हिस्सा नहीं है छुआ डिफ़ॉल्ट कॉल आउट बुलबुला दृश्य दिखाने के बिना (यह delected)।

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

कोई सुझाव? क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

14/10/2009 को 13:02
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


9 जवाब

वोट
53

वहाँ एक और भी आसान समाधान है।

एक कस्टम बनाने के लिए UIView(अपने कॉल आउट के लिए)।

तब का एक उपवर्ग बनाने MKAnnotationViewऔर ओवरराइड setSelectedइस प्रकार है:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
    {
        //Add your custom view to self...
    }
    else
    {
        //Remove your custom view...
    }
}

बूम, काम किया।

05/08/2011 को 12:16
का स्रोत उपयोगकर्ता

वोट
40

detailCalloutAccessoryView

पुराने दिनों में यह एक दर्द था, लेकिन एप्पल यह सुलझ गया है, बस पर डॉक्स जाँच MKAnnotationView

view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.detailCalloutAccessoryView = UIImageView(image: UIImage(named: "zebra"))

वास्तव में, बस इतना ही। किसी भी UIView ले जाता है।

23/07/2012 को 13:44
का स्रोत उपयोगकर्ता

वोट
13

@ TappCandy के शानदार ढंग से सरल उत्तर से पर जारी रखते हुए, यदि आप डिफ़ॉल्ट के रूप में एक ही तरीके से अपने बुलबुला चेतन करना चाहते हैं, मैं इस एनीमेशन विधि का उत्पादन किया गया है:

- (void)animateIn
{   
    float myBubbleWidth = 247;
    float myBubbleHeight = 59;

    calloutView.frame = CGRectMake(-myBubbleWidth*0.005+8, -myBubbleHeight*0.01-2, myBubbleWidth*0.01, myBubbleHeight*0.01);
    [self addSubview:calloutView];

    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^(void) {
        calloutView.frame = CGRectMake(-myBubbleWidth*0.55+8, -myBubbleHeight*1.1-2, myBubbleWidth*1.1, myBubbleHeight*1.1);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.1 animations:^(void) {
            calloutView.frame = CGRectMake(-myBubbleWidth*0.475+8, -myBubbleHeight*0.95-2, myBubbleWidth*0.95, myBubbleHeight*0.95);
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.075 animations:^(void) {
                calloutView.frame = CGRectMake(-round(myBubbleWidth/2-8), -myBubbleHeight-2, myBubbleWidth, myBubbleHeight);
            }];
        }];
    }];
}

यह काफी जटिल है, लेकिन जब तक आपके कॉल आउट बुलबुला की बात केन्द्र-नीचे होने के लिए डिज़ाइन किया गया है लग रहा है, तो आप सिर्फ बदलने के लिए सक्षम होना चाहिए myBubbleWidthऔर myBubbleHeightअपने स्वयं के आकार के साथ कार्य करने के लिए। और सुनिश्चित करें कि आपके subviews उनकी है बनाने के लिए याद autoResizeMask(यानी "सभी") संपत्ति 63 करने के लिए सेट इतना है कि वे एनीमेशन में सही ढंग से पैमाने।

: -Joe

24/10/2011 को 13:41
का स्रोत उपयोगकर्ता

वोट
8

इस मिला मेरे लिए सबसे अच्छा समाधान किया जाना है। आप कुछ रचनात्मकता का उपयोग करने के अपने खुद के अनुकूलन करना होगा

अपने में MKAnnotationViewउपवर्ग, आप उपयोग कर सकते हैं

- (void)didAddSubview:(UIView *)subview{
    int image = 0;
    int labelcount = 0;
    if ([[[subview class] description] isEqualToString:@"UICalloutView"]) {
        for (UIView *subsubView in subview.subviews) {
            if ([subsubView class] == [UIImageView class]) {
                UIImageView *imageView = ((UIImageView *)subsubView);
                switch (image) {
                    case 0:
                        [imageView setImage:[UIImage imageNamed:@"map_left"]];
                        break;
                    case 1:
                        [imageView setImage:[UIImage imageNamed:@"map_right"]];
                        break;
                    case 3:
                        [imageView setImage:[UIImage imageNamed:@"map_arrow"]];
                        break;
                    default:
                        [imageView setImage:[UIImage imageNamed:@"map_mid"]];
                        break;
                }
                image++;
            }else if ([subsubView class] == [UILabel class]) {
                UILabel *labelView = ((UILabel *)subsubView);
                switch (labelcount) {
                    case 0:
                        labelView.textColor = [UIColor blackColor];
                        break;
                    case 1:
                        labelView.textColor = [UIColor lightGrayColor];
                        break;

                    default:
                        break;
                }
                labelView.shadowOffset = CGSizeMake(0, 0);
                [labelView sizeToFit];
                labelcount++;
            }
        }
    }
}

और अगर subviewएक है UICalloutView, तो आप के चारों ओर इसके साथ पेंच कर सकते हैं और क्या यह अंदर क्या है।

31/08/2011 को 21:36
का स्रोत उपयोगकर्ता

वोट
6

मुझे भी यही समस्या थी। इस ब्लॉग पर इस विषय के बारे में ब्लॉग पोस्ट की एक गंभीर है http://spitzkoff.com/craig/?p=81

बस का उपयोग कर MKMapViewDelegateआप यहाँ और उपवर्गीकरण मदद नहीं करता है MKMapViewऔर मौजूदा कार्यक्षमता बढ़ाने के लिए भी मेरे लिए काम नहीं किया कोशिश कर रहा।

मैं क्या कर समाप्त हो गया मेरे अपने बनाने के लिए है CustomCalloutViewकि मैं अपने से शीर्ष पर चल रहा है MKMapView। आप आप चाहते हैं किसी भी तरह से इस दृश्य शैली दे सकते हैं।

मेरे CustomCalloutViewएक विधि यह एक जैसी ही है:


- (void) openForAnnotation: (id)anAnnotation
{
    self.annotation = anAnnotation;
    // remove from view
    [self removeFromSuperview];

    titleLabel.text = self.annotation.title;

    [self updateSubviews];
    [self updateSpeechBubble];

    [self.mapView addSubview: self];
}

यह एक लेता MKAnnotationवस्तु और अपने स्वयं के शीर्षक सेट करता है, बाद में यह दो अन्य तरीकों जो काफी बदसूरत हैं जो चौड़ाई और कॉलआउट सामग्री के आकार को समायोजित और बाद में सही स्थिति में इसके चारों ओर स्पीच बबल आकर्षित कहता है।

अंत में दृश्य MapView करने के लिए एक subview के रूप में जोड़ा जाता है। इस समाधान के साथ समस्या यह है कि सही स्थिति में रखने के लिए कॉल आउट जब मानचित्र दृश्य स्क्रॉल किया है कठिन है। मैं सिर्फ इस समस्या को हल करने के लिए एक क्षेत्र परिवर्तन पर मानचित्र दृश्य प्रतिनिधि विधि में कॉल आउट छुपा रहा हूँ।

यह उन सभी समस्याओं का समाधान करने के लिए कुछ समय लिया, लेकिन अब कॉल आउट लगभग अधिकारी एक तरह बर्ताव करता है, लेकिन मैं अपने खुद की शैली में पास है।

16/10/2009 को 11:35
का स्रोत उपयोगकर्ता

वोट
5

क) आ रहा से डिफ़ॉल्ट कॉल आउट बुलबुला रोकें: मूल रूप से इस को हल करने के लिए, एक की जरूरत है। ख) का पता लगाएं, जो एनोटेशन क्लिक किया गया था।

क) सं ख) उपवर्गीकरण, MKPinAnnotationView को canShowCallout की स्थापना और touchesBegan और touchesEnd तरीकों अधिभावी: मैं इन से प्राप्त करने में सक्षम था।

नोट: आप MKAnnotationView और नहीं MKMapView के लिए स्पर्श इवेंट संभालने की ज़रूरत है

20/11/2009 को 12:22
का स्रोत उपयोगकर्ता

वोट
3

मैं तो बस एक दृष्टिकोण के साथ आते हैं, विचार यहाँ है

  // Detect the touch point of the AnnotationView ( i mean the red or green pin )
  // Based on that draw a UIView and add it to subview.
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionWillChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x+5,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:YES];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionDidChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:NO];
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{  
    NSLog(@"Select");
    showCallout = YES;
    CGPoint point = [self.mapView convertPoint:view.frame.origin fromView:view.superview];
    [testview setHidden:NO];
    [testview  setCenter:CGPointMake(point.x+5,point.y-(testview.frame.size.height/2))];
    selectedCoordinate = view.annotation.coordinate;
    [self animateIn];
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{
    NSLog(@"deSelect");
    if(!showCallout)
    {
        [testview setHidden:YES];
    }
}

यहाँ - testview एक है UIViewआकार 320x100 का - showCallout BOOL है - [self animateIn];समारोह ऐसे ही दृश्य एनीमेशन करता है UIAlertView

26/01/2012 को 12:08
का स्रोत उपयोगकर्ता

वोट
1

मैं उत्कृष्ट SMCalloutView कि कॉल आउट के लिए एक कस्टम दृश्य प्रदान करने और लचीला चौड़ाई / ऊंचाइयों बहुत दर्द की इजाजत दी के साथ इस मुद्दे को हल करती है की मेरी कांटा बाहर धक्का दे दिया गया है। फिर भी बाहर काम करने के कुछ quirks है, लेकिन यह अब तक बहुत कार्यात्मक है:

https://github.com/u10int/calloutview

18/10/2012 को 00:04
का स्रोत उपयोगकर्ता

वोट
1

आप leftCalloutView उपयोग कर सकते हैं, करने के लिए annotation.text की स्थापना @ ""

उदाहरण के कोड कृपया नीचे:

pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
if(pinView == nil){
    pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];       
}
CGSize sizeText = [annotation.title sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:12] constrainedToSize:CGSizeMake(150, CGRectGetHeight(pinView.frame))                                 lineBreakMode:UILineBreakModeTailTruncation];
pinView.canShowCallout = YES;    
UILabel *lblTitolo = [[UILabel alloc] initWithFrame:CGRectMake(2,2,150,sizeText.height)];
lblTitolo.text = [NSString stringWithString:ann.title];
lblTitolo.font = [UIFont fontWithName:@"HelveticaNeue" size:12];
lblTitolo.lineBreakMode = UILineBreakModeTailTruncation;
lblTitolo.numberOfLines = 0;
pinView.leftCalloutAccessoryView = lblTitolo;
[lblTitolo release];
annotation.title = @" ";            
14/04/2011 को 10:18
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more