2011-04-24 14 views
7

मैं उपयोगकर्ता स्थान के लिए एक कस्टम MKAnnotationView बनाया है:एमकेयूसर स्थान कस्टम दृश्य नहीं बढ़ रहा है!

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 

{

if ([annotation isKindOfClass:[MKUserLocation class]]) { 

    if (navStatus == NavStatusHeadingEnabled) { 

     if ([annotation isKindOfClass:[MKUserLocation class]]) { 

      locationView = [[CustomLocationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationIdentifier"]; 
      return locationView; 

     } 

    } 

    return nil; 

} 

CustomLocationView.h

 - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier 
    { 
     self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
     if (self != nil) 
     { 


      self.backgroundColor = [UIColor clearColor]; 
      blueDot = [UIImage imageNamed:@"userLocationDot.png"].CGImage; 
      CGImageRetain(blueDot); 

      CGPoint blueDotCenter = CGPointMake((self.frame.size.width - (CGImageGetWidth(blueDot)/2))/2, (self.frame.size.height - (CGImageGetHeight(blueDot)/2))/2); 

      blueDotLayer = [CALayer layer]; 
      blueDotLayer.frame = CGRectMake(blueDotCenter.x, blueDotCenter.y , CGImageGetWidth(blueDot)/2, CGImageGetHeight(blueDot)/2); 
      blueDotLayer.contents = (id)blueDot; 
      blueDotLayer.shadowOpacity = 0.4; 
      blueDotLayer.shadowColor = [UIColor blackColor].CGColor; 
      blueDotLayer.shadowOffset = CGSizeMake(0.4, 0.3); 
      blueDotLayer.shadowRadius = 1.0f; 

      [self.layer insertSublayer:blueDotLayer above:self.layer]; 

     } 

     return self; 
    } 

- (void)setAnnotation:(id <MKAnnotation>)annotation 
{ 
    [super setAnnotation:annotation]; 

    [self setNeedsDisplay]; 
} 





- (void)dealloc { 

    [blueDotLayer release]; 


    [super dealloc]; 
} 

समस्या यह सिर्फ एक ही जगह पर रहता है और आगे बढ़ नहीं है नीले बिंदु की तरह। मैं क्या गलत कर रहा हूँ?

धन्यवाद विधेयक।

+0

बस इस मुद्दे का सामना करना पड़ा है। क्या 'CLLocationManager' का उपयोग किए बिना इसे संभालने का कोई तरीका है? – anticyclope

उत्तर

0

विधेयक,

आप एक CLLocationManager कि किसी लागू desiredAccuracy और distanceFilter साथ शुरू कर दिया गया और उसके बाद लागू प्रतिनिधि तरीकों को लागू करने, और locationManager उदाहरण पर प्रतिनिधि के रूप में अपने खुद के कोड सेट की जरूरत है।

कम से कम आपके पास निम्न विधि होनी चाहिए जो स्थान प्रबंधक प्रबंधक वांछित अधिकार के साथ वर्तमान स्थान को निर्धारित करने के बाद कॉल करेगा और फिर जब भी दूरीफिल्टर से मुलाकात की गई हो।

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation ; 

चीयर्स, मैक

+0

हाय मैक, आपके उत्तर के लिए धन्यवाद। मैं पहले ही CLLocationManager प्रतिनिधियों को लागू कर रहा हूं। नीला बिंदु वहां है और सही ढंग से अद्यतन कर रहा है। मेरी समस्या तब होती है जब आप कस्टम एनोटेशन व्यू (एमकेएएनोटेशन व्यू *) का उपयोग करके कस्टम एनोटेशन व्यू के साथ बदलते हैं। दृश्य: (एमकेमैप व्यू *) मानचित्र देखें व्यूअनोटेशन: (आईडी <एमकेएनोटेशन> और जांचना ((एनोटेशन isKindOfClass: [MKUserLocation class]]), यह बदल दिया गया मेरे कस्टम व्यू के साथ नीला बिंदु, लेकिन अब अपडेट नहीं हो रहा है, यह अभी भी एक ही स्थान पर खड़ा है। – Nimrod7

5

मैं अभी भी इस समस्या में पड़ गए। मुझे यकीन नहीं है कि यह व्यवहार की उम्मीद है या नहीं, लेकिन किसी भी कारण से हमारे कस्टम एमकेयूसर स्थान एनोटेशन विचारों को स्थानांतरित करने के लिए हमारे ऊपर निर्भर है।

एक अनुभवहीन समाधान

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    [[self mapView] setShowsUserLocation:NO]; 

    [[self mapView] setShowsUserLocation:YES]; 
} 

है लेकिन इस स्क्रीन जो मैं अवांछनीय पाया चारों ओर वर्तमान स्थान एनोटेशन कूद बनाता है।

अभी तक बेहतर आपके विचार नियंत्रक में एक इवर के रूप में कस्टम एनोटेशन देखने के लिए एक संदर्भ रखना है और उसके बाद कार्य करें:

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    CGPoint newCenterPoint = [[self mapView] convertCoordinate:[location coordinate] toPointToView:[[self customAnnotationView] superview]]; 
    newCenterPoint.x += [[self customAnnotationView] centerOffset].x; 
    newCenterPoint.y += [[self customAnnotationView] centerOffset].y; 

    [UIView animateWithDuration:0.3f animations:^{ 
     [[self customAnnotationView] setCenter:newCenterPoint]; 
    }]; 

} 

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

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:NO]; 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:YES]; 
} 
0

मैं सिर्फ इस समस्या के लिए एक जवाब मिल गया। मेरा कोड मोनोटच में है, लेकिन ओबीजेसी में इसे फिर से करना आसान होना चाहिए। डिफ़ॉल्ट रूप से MKUserLocation पर अनुकूलित छवि दिखाने के लिए हमें मूल के शीर्ष पर एक सबव्यूव जोड़ने की आवश्यकता है। ऐसा करने के लिए, MKMapView प्रतिनिधि

void DidAddAnnotationViews (object sender, MKMapViewAnnotationEventArgs e) 
{ 
      MKAnnotationView v = mapView.ViewForAnnotation(mapView.UserLocation); 
      if(v != null) 
      { 
       if(v.Subviews.Count() == 0) 
       { 
        UIImageView iv = new UIImageView(new RectangleF(0,0, 22, 22)); 
        iv.Image = UIImage.FromFile("res/pins/Yhere.png"); 
        v.AddSubview(iv); 
        v.BringSubviewToFront(iv); 
       } 
      } 
} 

यह नीले डॉट के शीर्ष पर चलती कस्टम छवि देता में DidAddAnnotationViews ओवरराइड। अधिक से अधिक, उपयोगकर्ता ट्रैकिंग और स्थान अपडेट सुविधाएं पूरी तरह से काम करती हैं और आप अभी भी नीली मंडल देख सकते हैं जो स्थान सटीकता को इंगित करती है।

मज़ेसर स्थानान्तरण को अनुकूलित करने में मजा लें!

0

यहाँ

मैं सिर्फ MapKit इंजीनियरों से बात कर समाप्त और इसकी पुष्टि की है कि इस आईओएस में एक बग है से Apple डेवलपर तकनीकी सहायता जवाब है। मेरा परीक्षण ऐप एक ही समस्या का सामना कर रहा है।

मैं नहीं जानता कि अगर यह iOS 6 में तय किया गया था, इस सवाल का जवाब आईओएस 5.

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