2009-11-07 9 views
29

पर रीफ्रेश करें, मैं अपने कस्टम MKAnotationView के लिए छवियों को सिंक्रनाइज़ रूप से लोड करना चाहता हूं; मैं पहले से ही EGOImageView-framework का उपयोग कर रहा हूं (यह UITableViews के साथ बहुत अच्छी तरह से चला जाता है), लेकिन मैं इसे MKMapView पर काम करने में विफल रहता हूं। छवियों को लोड किया प्रतीत होता है, लेकिन मैं उन्हें मानचित्र पर रीफ्रेश नहीं कर सकता - [myMap setNeedsDisplay] कुछ भी नहीं करता है।MKAnnationView को MKMapView

उत्तर

35

मैं इसे अपने आप की कोशिश की है नहीं है, लेकिन यह काम हो सकता है:
MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation विधि का उपयोग कर टिप्पणी के लिए विचार प्राप्त करें और इसे करने के लिए नई छवि निर्धारित किया है।

संपादित करें: कि अपने आप करने की कोशिश की और इस दृष्टिकोण मेरे लिए ठीक काम किया:

// Function where you got new image and want to set it to annotation view 
for (MyAnnotationType* myAnnot in myAnnotationContainer){ 
    MKAnnotationView* aView = [mapView viewForAnnotation: myAnnot]; 
    aView.image = [UIImage imageNamed:@"myJustDownloadedImage.png"]; 
} 

इस विधि सभी एनोटेशन छवियों को अद्यतन किया गया कॉल करने के बाद।

+0

इस तरह यह अभी किया गया है। लेकिन इस तरह छवि को सिंक्रनाइज़ रूप से लोड किया जाता है। – cocoapriest

+0

और यदि छवि लोड होने के बाद आप इसे कॉल करते हैं और इस छवि को दृश्य में सेट करते हैं - क्या यह काम नहीं करता है? – Vladimir

+0

यह सवाल है - बाद में इस छवि को कैसे सेट करें। ऐसा करने से, छवि MKAnotationView – cocoapriest

2

यही एक रास्ता है मैं MKAnnotationViews की redraw मजबूर करने के लिए मिल गया है है: मानचित्र दृश्य के

// बल अद्यतन (अन्यथा एनोटेशन विचारों पुनः बनाने नहीं होगा)

CLLocationCoordinate2D केंद्र = mapView.centerCoordinate;

mapView.centerCoordinate = center;

बेकार लगता है, लेकिन यह काम करता है।

+1

नहीं, यह नहीं है। मैंने अभी कोशिश की है :( –

+0

मेरे लिए काम करता है! धन्यवाद – nurxyz

+0

मेरे लिए भी काम करता है .. – pnizzle

14

मैं एनोटेशन अद्यतन करने के लिए केवल एक विश्वसनीय रास्ता मिल गया है, दूसरों के तरीकों मेरे लिए काम नहीं किया: बस को दूर करने और एनोटेशन फिर से जोड़ने:

id <MKAnnotation> annotation; 

// ... 

[mapView removeAnnotation:annotation]; 
[mapView addAnnotation:annotation]; 

इस कोड को कर देगा - [MapView: viewForAnnotation:] होने के लिए फिर से बुलाया जाता है और इसलिए आपका एनोटेशन व्यू फिर से बनाया जाएगा (या यदि आप सही डेटा के साथ dequeueReusableAnnotationViewWithIdentifier का उपयोग करते हैं तो पुन: उपयोग किया जाएगा।

+0

मैं एकल तकनीक एनप्रेशन रीफ्रेशमेंट – nurxyz

+0

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

+0

हाँ मुझे उनको ताज़ा करने के लिए फिर से गहन रूप से जोड़ना पड़ा। – coolcool1994

1

यह मैं

#import "EGOImageView.h" 

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //ENTER_METHOD;  
    if([annotation isKindOfClass:[MKUserLocation class]]) return nil; 
    MKPinAnnotationView *annView; 

    static NSString *reuseIdentifier = @"reusedAnnView"; 
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    annView.canShowCallout = YES; 
    annView.calloutOffset = CGPointMake(-5.0f, 0.0f); 
    annView.opaque = NO; 
    annView.image = [[UIImage imageNamed:@"tempImage.png"] retain]; 

    YourModel *p = annotation; // make this conform to <MKAnnotation> 
    EGOImageView *egoIV = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"tempImage.png"]]; 
    [egoIV setDelegate:self]; 
    egoIV.imageURL = [NSURL URLWithString:p.theUrlToDownloadFrom]; 
    [annView addSubview:egoIV]; 
    [egoIV release]; 


    return [annView autorelease]; 
} 
1

के लिए काम किया (मुझे इंगित करने के लिए कैसे है कि इस पोस्ट के zerodiv का जवाब संबंधित नहीं दिख रहा है।) मैं तरह की एक किकस्टार्ट जोड़कर काम करने के लिए विधि zerodiv के प्राप्त करने में सक्षम था, के लिए मजबूर एक अर्थहीन लेकिन अलग समन्वय, फिर पूर्व, सही एक बहाल करना। पहली जगह की वजह से स्क्रीन बिल्कुल फ्लैश नहीं होती है।

CLLocationCoordinate2D center = mapView.centerCoordinate; 
CLLocationCoordinate2D forceChg; 
forceChg.latitude = 0; 
forceChg.longitude = curLongNum; 

mapView.centerCoordinate = forceChg; 
mapView.centerCoordinate = center;