कैसे MKAnnotationViews ओवरलैपिंग के आदेश को परिभाषित करने के?

वोट
29

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

एक (बहुत वापस वैकल्पिक रूप से या कम से कम), लगता होगा शायद, कि एनोटेशन सबसे हाल ही में मानचित्र में जुड़ना सामने अंत होगा, लेकिन यह सिर्फ नियम होने के लिए प्रतीत नहीं होता। जहाँ तक मेरा बता सकते हैं, मैं बना सकते हैं और पहले सभी गैर चलती एनोटेशन जोड़ने, और फिर कुछ नव instantiated चलती एनोटेशन जोड़ने, लेकिन उनमें से कई (हालांकि सभी नहीं!) अंत सदा शेयर-अभी भी लोगों के तहत तैयार की गई।

दिलचस्प बात यह है, जब समय से भी जाना जाता है, और अभी तक नए चलती एनोटेशन बनाई गई हैं, वे पहले की तुलना में शीर्ष करने के लिए और अधिक खिंचने लगते हैं - के बाद ही nonmoving भागों को पहले से ही नक्शे में जोड़ा गया था सब आगे बढ़ एनोटेशन वस्तुओं बनाए गए थे, भले ही।

किसी मानचित्र पर एनोटेशन विचारों का यह अजीब प्राकृतिक व्यवस्था को बदलने के लिए एक चाल पता है? मैं मानचित्र किट एपीआई खोज करने के लिए करने की कोशिश की है, लेकिन यह ऐसी बात की बात करने के लिए प्रतीत नहीं होता।

17/07/2009 को 20:33
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
38

ठीक है, तो के लिए MKMapViewDelegate से समाधान उपयोग विधि


- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
 

इस विधि में आप AnnotationView को पुनर्व्यवस्थित करना चाहिए के बाद यह MapKit देखें में जोड़ा गया था। तो, कोड मई इस तरह दिखता है:


- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
   for (MKAnnotationView * annView in views) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation];
      if ([ann top]) {
         [[annView superview] bringSubviewToFront:annView];
      } else {
         [[annView superview] sendSubviewToBack:annView];
      }
   }

}

यह मेरे लिए काम करता है।

31/07/2009 को 17:09
का स्रोत उपयोगकर्ता

वोट
11

में सेटअप एनोटेशन दृश्य परत की zPosition (annotationView.layer.zPosition) करने के लिए प्रयास करें:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
03/05/2013 को 11:40
का स्रोत उपयोगकर्ता

वोट
4

स्विफ्ट 3:

मैं एपीआई से स्थान पिन मिलता है और मैं इसी तरह के मुद्दों हो रही थी, पिन कि शीर्ष पर होना था नहीं थे। मैं इस तरह इसे हल करने में सक्षम था।

var count = 0 // just so we don't get the same index in bottom pins
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {  
    for view in views {
        view.layer.zPosition = CGFloat(count)
    }
    count += 1
    if count > 500 {
        count = 250 // just so we don't end up with 999999999999+ as a value for count, plus I have at least 30 pins that show at the same time and need to have lower Z-Index values than the top pins. 
    }

}

उम्मीद है की यह मदद करेगा

05/12/2016 को 21:06
का स्रोत उपयोगकर्ता

वोट
3

आईओएस 11 के कार्यान्वयन के तहत displayPriorityतोड़ दिया सब समाधान जो उपयोग bringSubviewToFrontया zPosition

आप एनोटेशन देखने के CALayer ओवरराइड हैं, तो आप zPosition के नियंत्रण ओएस से वापस कुश्ती कर सकते हैं।

class AnnotationView: MKAnnotationView {

    /// Override the layer factory for this class to return a custom CALayer class
    override class var layerClass: AnyClass {
        return ZPositionableLayer.self
    }

    /// convenience accessor for setting zPosition
    var stickyZPosition: CGFloat {
        get {
            return (self.layer as! ZPositionableLayer).stickyZPosition
        }
        set {
            (self.layer as! ZPositionableLayer).stickyZPosition = newValue
        }
    }

    /// force the pin to the front of the z-ordering in the map view
   func bringViewToFront() {
        superview?.bringSubview(toFront: self)
        stickyZPosition = CGFloat(1)
    }

    /// force the pin to the back of the z-ordering in the map view
   func setViewToDefaultZOrder() {
        stickyZPosition = CGFloat(0)
    }

}

/// iOS 11 automagically manages the CALayer zPosition, which breaks manual z-ordering.
/// This subclass just throws away any values which the OS sets for zPosition, and provides
/// a specialized accessor for setting the zPosition
private class ZPositionableLayer: CALayer {

    /// no-op accessor for setting the zPosition
    override var zPosition: CGFloat {
        get {
            return super.zPosition
        }
        set {
            // do nothing
        }
    }

    /// specialized accessor for setting the zPosition
    var stickyZPosition: CGFloat {
        get {
            return super.zPosition
        }
        set {
            super.zPosition = newValue
        }
    }
}
25/01/2018 को 23:23
का स्रोत उपयोगकर्ता

वोट
2

मैं खोजने रहा है कि यह व्याख्या विचारों को पुन: क्रम कॉलआउट पॉप अप होने वाले जब एक अब सभी एनोटेशन के शीर्ष पर होना करने के लिए क्लिक किया जाता है का कारण बनता है। मैं भी यह इतना है कि बजाय परिष्कृत करने की कोशिश की है bringSubviewToFrontऔर sendSubviewToBack, मैं का उपयोग करें insertSubview:aboveSubviewऔर insertSubview:belowSubview:जहां दूसरा तर्क सूची में पहले annotationView है। यह बिखरने वापस करने के लिए बहुत कम सामने पैदा करने के लिए प्रतीत होता है, लेकिन कॉल बहिष्कार अभी भी कुछ एनोटेशन के तहत पॉप अप।

05/11/2009 को 15:21
का स्रोत उपयोगकर्ता

वोट
1

प्रतिनिधि समारोह में, आप पिन शीर्ष पर मजबूर करने के लिए चुन सकते हैं:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?` {
    ...
    if my annotation is the special one {
        annotationView.isSelected = true
    }
    ...
}
18/02/2019 को 01:32
का स्रोत उपयोगकर्ता

वोट
0

मैं वास्तव में यह करने के लिए की जरूरत है, और (वर्तमान) जवाब में से कोई भी एक विश्वसनीय कार्यान्वयन प्रदान करने के लिए लग रहा था। वे एक तरह से काम किया है, लेकिन नक्शे पैनिंग, एनोटेशन को चुनकर, या गंदगी आदेश सकता है फिर से ज़ूम करना।

अंतिम, अच्छी तरह व्यवहार समाधान तो तुच्छ नहीं था, तो मैं बस चरणों मैं यहाँ ले लिया रूपरेखा जाएगा। एनोटेशन आदेश है कि MKMapViewका उपयोग करता है जोड़ा आदेश, या यहां तक कि एक ओवरराइड के आदेश सम्मान नहीं करता है annotationsसंपत्ति। इसलिए...


कदम

• एक बनाएं CADisplayLink
• हर फ्रेम, उपयोग करते हुए एनोटेशन को पुन: व्यवस्थित दोनों परत zPosition, और superview के दशक में दृश्य के आदेश subviewsसरणी।
• दृश्य चयन किया जाता है, तो यह आपके आदेश योजना में सामने से बढ़ावा देने के
• एनोटेशन पर टैप करने से अभी भी आंतरिक का सम्मान करता है MKMapView, आदेश पहले से ही किए गए परिवर्तनों के बावजूद। इस का मुकाबला करने के लिए, एक जोड़ने के MKMapViewDelegate
प्रतिनिधि वस्तु के दशक में • mapView:didSelect:विधि, देखें कि क्या चयनित एनोटेशन आप इसे अपनी पसंद का हो रहा है
• आप, अपने आप को एनोटेशन पर हिट परीक्षण चलाकर सही / प्राथमिकता के आधार पर एनोटेशन पता लगा सकते हैं अपने खुद के आदेश देने के साथ को ध्यान में रखा
• चयनित एनोटेशन सही, महान है। यदि नहीं, तो मैन्युअल रूप से सही व्याख्या का उपयोग कर चयनselectAnnotation:animated:


आखिर तुमने इसे हासिल कर ही लिया है। उपरोक्त विधि अच्छी तरह से काम करने लगता है, और यह प्रत्येक फ्रेम चलने से प्रदर्शन हिट बहुत बुरा नहीं है। तुम भी MapBox, जो मेरा मानना ​​है कि एनोटेशन आदेश का समर्थन करता है का उपयोग करने जा देखो सकता है, लेकिन यह हमेशा विभिन्न कारणों के लिए एक विकल्प नहीं है।

15/09/2017 को 01:54
का स्रोत उपयोगकर्ता

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