Nasıl MKAnnotationViews örtüşen sırasını tanımlamak için?

oy
29

Benim haritasında birkaç MKAnnotations (ve bunlara karşılık gelen görüşlerini) var ve bu bazen gerçekten kalabalık olur. Şimdi, benim app ek açıklamaları iki çeşidi bulunuyor: Bazı nerede olduklarını zaman geçtikçe diğerleri hareket ederken, kalmak bağlanmıştır. Hep önlerinde geçmesine görsel arka planda daha kararlı olanlar ve hareketli olanları olmasını tercih ederim.

Bir en son haritaya eklendi ek açıklamalar cepheye sona ereceğini, belki de düşünürdüm (ya da alternatif çok geride, en azından) ama bu sadece kural olarak görünmüyor. Bildiğim kadarıyla söyleyebilirim, ben oluşturmak ve ilk TÜM olmayan hareketli, açıklama ekleme ve sonra bazı yeni örneği hareketli, açıklama ekleme, ama (hepsi değil rağmen!) Bunların çoğu sonunda sürekli stok-hala olanları altında çizilmiş.

Zaman geçtikçe ve henüz yeni hareketli ek açıklamalar oluşturulduğunda, bu kişilerde ilk olanlardan daha üstüne fazla çekilme eğilimi - nonmoving parçalar zaten haritaya eklendi sonra tüm hareketli açıklama nesneleri oluşturuldukları bile.

Herkes haritasında açıklama görüşlerin bu garip doğal düzenini değiştirmek için bir numara biliyor mu? Ben Harita Seti API arama çalıştı, ama böyle bir şeyi konuşmak görünmüyor.

Oluştur 17/07/2009 saat 20:33
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
38

Ok, MKMapViewDelegate solüsyonun kullanımı yöntemi


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

o mapKit View eklendikten sonra bu yöntemde size AnnotationView yeniden düzenlemek gerekir. Yani, kod mayıs şöyle görünür:


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

}

Bu benim için çalışıyor.

Cevap 31/07/2009 saat 17:09
kaynak kullanıcı

oy
11

kurulum açıklama görünümü katmanın zPosition (annotationView.layer.zPosition) için deneyin:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
Cevap 03/05/2013 saat 11:40
kaynak kullanıcı

oy
4

3 Swift:

Ben API gelen konum sabitleyin olsun ve ben benzer sorunları yaşıyordu, üstünde olmak zorunda pimleri değildi. Ben böyle çözmeyi başardı.

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

}

Bu yardımcı olur umarım

Cevap 05/12/2016 saat 21:06
kaynak kullanıcı

oy
3

IOS 11'in uygulanması Altında displayPrioritykullanmak kırdı bütün çözümleri bringSubviewToFrontveya zPosition.

Ek açıklamalarda görünümün CALayer geçersiz, geri OS zPosition kontrolünü sereceksin.

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
        }
    }
}
Cevap 25/01/2018 saat 23:23
kaynak kullanıcı

oy
2

Ben açıklama görüşlerini yeniden sıralama bu artık tüm ek açıklamaların üstünde olmak tıklandığında açılan çizgisi neden olduğunu buluyorum. Hatta böylece yerine rafine denedim bringSubviewToFrontve sendSubviewToBackben kullanmak insertSubview:aboveSubviewve insertSubview:belowSubview:ikinci argüman listesindeki ilk annotationView olduğu. Bu saçılma arkaya çok daha az ön neden gibi görünüyor, ancak arama çıkışları hala bazı ek açıklamalar altında açılır.

Cevap 05/11/2009 saat 15:21
kaynak kullanıcı

oy
1

temsilci işlevinde, üstüne zorlamak için pimi seçebilir:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?` {
    ...
    if my annotation is the special one {
        annotationView.isSelected = true
    }
    ...
}
Cevap 18/02/2019 saat 01:32
kaynak kullanıcı

oy
0

Bunu gerçekten yapmak gerekiyordu ve (mevcut) cevapların hiçbiri güvenilir bir uygulama sağlamak için görünüyordu. Onlar tür ek açıklamaları seçerek veya pisliği düzeni olabilir tekrar yakınlaştırma, çalıştı, ama harita kaydırma.

Nihai, iyi huylu çözüm o kadar önemsiz değildir, bu yüzden sadece burada aldı adımları değineceğiz. Ek açıklama sipariş MKMapViewilave düzeni veya overriden hatta sırasını saygı duymayan kullanır annotationsözelliği. Yani...


adımlar

• Bir oluşturma CADisplayLink
, vardır • Her çerçeve kullanarak ek açıklamaları yeniden düzenlemek hem katman zPosition ve Superview en içinde görünümün sipariş subviewsdizisi.
• görünüm seçilirse, sizin sipariş düzeni öne teşvik
ek açıklamalarına yapılan dokunulduğunda hala iç saygı • MKMapViewHalihazırda yapılan değişikliklerle rağmen, sipariş. Bunu engellemek için, bir ekleme MKMapViewDelegate
temsilci nesnenin içinde • mapView:didSelect:Seçilen açıklama bunu olması istediğim şey olup olmadığını kontrol, yöntemin
Kendi sipariş ile, ek açıklamalar kendinizi isabet testleri çalıştırarak doğru / öncelikli ek açıklama anlamaya • hesap önünde
• seçilen açıklama, büyük doğruysa. Değilse, elle kullanarak doğru açıklamayı seçmekselectAnnotation:animated:


İşte buyur. Yukarıdaki yöntem iyi iş gibi görünüyor ve bu her kareyi çalışmasını performans isabet çok kötü değil. Ayrıca ben açıklama sipariş destekler inanıyoruz MapBox, geçiş bakmak olabilir, ama bu her zaman çeşitli nedenlerle bir seçenek değildir.

Cevap 15/09/2017 saat 01:54
kaynak kullanıcı

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