Πώς να καθορίσει τη σειρά των επικαλυπτόμενων MKAnnotationViews;

ψήφοι
29

Έχω αρκετές MKAnnotations (και τις αντίστοιχες απόψεις τους) στο χάρτη μου, και μερικές φορές παίρνει πραγματικά πολύ κόσμο. Τώρα, οι σχολιασμοί στην εφαρμογή μου έρχονται σε δύο γεύσεις: κάποιοι είναι βέβαιο ότι θα παραμείνουν εκεί που βρίσκονται, ενώ άλλοι θα κινηθεί όσο περνάει ο καιρός. Θα προτιμούσα να έχουν τις πιο σταθερές αυτές οπτικά στο παρασκήνιο και τα κινητά αυτά για να περάσει πάντα μπροστά τους.

Κάποιος θα σκεφτόταν, ίσως, ότι οι σχολιασμοί προστεθεί πρόσφατα στο χάρτη, θα καταλήξετε προς τα εμπρός (ή, εναλλακτικά, στο πολύ πίσω, τουλάχιστον), αλλά αυτό ακριβώς δεν φαίνεται να είναι ο κανόνας. Σε ό, τι μπορώ να πω, έχω δημιουργήσει και να προσθέσετε όλα τα μη κινείται σχόλια πρώτα, και στη συνέχεια προσθέστε μερικά πρόσφατα τεκμηριώθηκε κινείται σχολιασμούς, αλλά πολλοί από αυτούς (αν όχι όλα!) Καταλήγουν που κάτω από τις διαρκώς χρηματιστήριο ακόμα αυτά.

Είναι ενδιαφέρον ότι, όταν περνάει ο καιρός, και όμως τα νέα κινούμενα σχόλια που δημιουργήθηκε, τείνουν να κλίνουν περισσότερο προς την κορυφή από τους πρώτους που - ακόμη και αν όλα τα κινούμενα αντικείμενα σχολιασμό δημιουργήθηκαν μόνο μετά τις nonmoving μέρη είχαν ήδη προστεθεί στο χάρτη.

Ξέρει κανείς ένα τέχνασμα για να αλλάξει αυτή την παράξενη φυσική τάξη των απόψεων σχολιασμό στο χάρτη; Προσπάθησα να κάνετε αναζήτηση στο χάρτη Kit API, αλλά δεν φαίνεται να μιλάμε για κάτι τέτοιο.

Δημοσιεύθηκε 17/07/2009 στις 20:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
38

Ok, οπότε για τη μέθοδο χρήσης διαλύματος από MKMapViewDelegate


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

Σε αυτή τη μέθοδο θα πρέπει να ρυθμίσετε εκ νέου AnnotationView αφού προστέθηκε στον mapKit View. Έτσι, κωδικό Μαΐου μοιάζει με αυτό:


- (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

Swift 3:

Παίρνω θέσεις ακίδων από τις API και είχα παρόμοια προβλήματα, οι καρφίτσες που έπρεπε να είναι στην κορυφή δεν ήταν. Ήμουν σε θέση να το λύσουμε σαν αυτό.

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

Σύμφωνα με iOS 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χρησιμοποιεί δεν σέβεται την προστιθέμενη τάξης, ή ακόμα και τη σειρά του overriden 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