Hogyan határozzák meg a sorrendben átfedő MKAnnotationViews?

szavazat
29

Én több MKAnnotations (és a hozzájuk tartozó nézetek) az én térképen, és néha az igazán zsúfolt. Most, a kommentárok az én app jön két változatban: néhány óhatatlanul maradnak, ahol vannak, míg mások fog mozogni az idő múlásával. Azt szeretné, hogy a stabilabb is, vizuálisan a háttérben, és a mozgó is, hogy mindig át előttük.

Az ember azt gondolná, talán, hogy a megjegyzések legutóbb felkerült a térképre a végén az első (vagy alternatív leghátul, legalábbis), de ez csak nem úgy tűnik, hogy a szabályt. Amennyire én tudom, tudok létrehozni és hozzáadni a nem mozgó kommentárok először, majd adjunk hozzá néhány újonnan példányai mozgó jelölések, de sokan közülük (bár nem minden!) A végén alá vont által állandóan mozdulatlanul is.

Érdekes, hogy amikor az idő múlásával, és mégis új, mozgó kommentárok létre, hajlamosak vonzódik inkább a felső, mint az elsők - akkor is, ha az összes mozgó objektumok kommentár után jön létre nonmoving részeket már szerepel a térképen.

Tudja valaki, hogy a trükk, hogy változtat ezen a furcsa természetes rendje a kommentár véleményét a térkép? Próbáltam keresni a térképen Kit API, de úgy tűnik, nem beszélni egy ilyen dolog.

A kérdést 17/07/2009 20:33
a forrás felhasználó
Más nyelveken...                            


7 válasz

szavazat
38

Ok, így oldatos használatra módszert MKMapViewDelegate


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

Ebben az eljárásban meg kell átrendezni AnnotationView után adunk mapKit View. Tehát a kód így néz ki:


- (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];
      }
   }

}

Ez nekem dolgozik.

Válaszolt 31/07/2009 17:09
a forrás felhasználó

szavazat
11

Próbáld beállítási kommentár nézet réteg zPosition (annotationView.layer.zPosition) in:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
Válaszolt 03/05/2013 11:40
a forrás felhasználó

szavazat
4

Swift 3:

Kapok pin helyeket API, és én is hasonló problémáid, a csapokat kellett lennie a tetején nem volt. Sikerült megoldani, mint ez.

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. 
    }

}

Remélem ez segít

Válaszolt 05/12/2016 21:06
a forrás felhasználó

szavazat
3

IOS 11 végrehajtását displayPrioritytört az összes megoldást használó bringSubviewToFrontvagy zPosition.

Ha felülírja a megjegyzés nézet CALayer, akkor birkózni ellenőrzése zPosition vissza az operációs rendszer.

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
        }
    }
}
Válaszolt 25/01/2018 23:23
a forrás felhasználó

szavazat
2

Én megállapította, hogy ez a átrendezésével a kommentár nézetek hatására a kiemelő felugró egyik kattintott már nem lesz a tetején a kommentárokat. Én is próbáltam finomítani úgy, hogy ahelyett, bringSubviewToFrontés sendSubviewToBackazt használja insertSubview:aboveSubview, és insertSubview:belowSubview:ahol a második argumentum az első annotationView a listában. Ez úgy tűnik, sokkal kevésbé okoz elölről hátrafelé szórással, de a hívás bínját is felbukkan alatt néhány megjegyzést.

Válaszolt 05/11/2009 15:21
a forrás felhasználó

szavazat
1

A delegált funkciót, akkor válassza ki a csapot, hogy erőt, hogy a tetején:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?` {
    ...
    if my annotation is the special one {
        annotationView.isSelected = true
    }
    ...
}
Válaszolt 18/02/2019 01:32
a forrás felhasználó

szavazat
0

Igazán szükség van erre, és egyik sem a (jelenlegi) választ tűnt, hogy megbízható végrehajtását. Ezek a fajta dolgozott, de úsztatás a térképen, kommentárok lehetőség kiválasztásával, vagy nagyítás tudott elrontani a sorrendben újra.

A végső, jól viselkedett megoldás nem volt annyira triviális, úgyhogy csak körvonalazza a lépéseket tettem ide. A kommentár rendelési hogy MKMapViewhasznál nem tartja tiszteletben a hozzáadott sorrendben, vagy akár a sorrendben egy felülírják annotationstulajdon. Így...


Lépések

• Hozzon létre egy CADisplayLink
• Minden keret, átrendezése megjegyzéslistával mind a réteg zPosition, és a nézet a rendezés az SuperView a subviewstömb.
• Ha a nézet van kiválasztva, támogassák azt, hogy az első a rendezési sémáját
• koppintás kommentárok mindig tiszteletben belső MKMapViewrendelés, annak ellenére, hogy már módosították. Ennek ellensúlyozására, hozzáadni MKMapViewDelegate
• A küldött objektum mapView:didSelect:módszer, ellenőrizze, hogy a kiválasztott feljegyzés, hogy mit szeretne, hogy legyen
• Akkor kitalálni a helyes / elsőbbséget kommentár futtatásával hit vizsgálatokat a kommentárok magát, a saját rendelési figyelembe venni
• Ha a kiválasztott feliratozást helyes, jó. Ha nem, akkor manuálisan válassza ki a megfelelő kommentár segítségévelselectAnnotation:animated:


És ott van ez. A fenti módszer úgy tűnik, hogy jól működik, és a teljesítménye hit futását ez minden egyes képkocka nem túl rossz. Te is nézd meg váltás MapBox, ami azt hiszem támogatja kommentár rendelés, de ez nem mindig van lehetőség különböző okok miatt.

Válaszolt 15/09/2017 01:54
a forrás felhasználó

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