2009-11-05 17 views
13

Jestem coraz bardziej sfrustrowany ograniczeniami MKMapKit. Mój obecny problem związany jest z porządkowaniem widoków adnotacji, szczególnie w odniesieniu do dotknięć. Jeśli zaakceptujesz domyślną kolejność Z, zestaw map daje ci:Zamawianie Z MKAnnotationViews

  1. Kolejność jest losowa. Kolejność z-zi nie jest powiązana z kolejnością dodawania adnotacji.
  2. Jeśli jedna adnotacja kończy się na drugiej, dotknięcie górnej adnotacji powoduje wyświetlenie objaśnienia do dolnej adnotacji. Wygląda na to, że wykrywanie trafień nie spełnia nawet kolejności losowania. Co z tym?

Próbowałem rozwiązywania nr 1 przy użyciu coś podobnego do następującego kodu znalezionego w internecie (który został zaprojektowany, aby dać pewną kontrolę nad Z-order)

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

} 

przebiegającej przez widoków adnotacji przeszły do mapView: didAddAnnotationViews: i dostosowanie ich kolejności -z wydaje się naprawić # 1. Problem polega na tym, że widoki objaśnień nie są już zawsze widoczne w widokach adnotacji. Wygląda na to, że MapKit bardzo się myli co do warstw (objaśnienia powinny być rysowane w warstwie ponad wszystkimi widokami adnotacji). Mogę nawet dowiedzieć się, jak to jest mylone, ponieważ wszystkie otrzymane MKAnnotationView mają ten sam superview (prywatna klasa MKOverlayView). Można by pomyśleć, że każdy rozsądny projekt mógłby narysować objaśnienia dotyczące tego widoku nakładki.

Czy ktoś rozwiązał pomyślnie # 1 lub # 2?

+0

Skąd wziąłeś klasę TopBottomAnnotation? –

+0

TopBottomAnnotation to nazwa twojej klasy opisu adnotacji –

+1

... prawie 6 lat później i mam ten sam problem. Jak to się nie udało? – Tys

Odpowiedz

8

Jeśli masz zwyczaj annotationView (co brzmi jak już masz), można spróbować dodać to:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Skutkiem ubocznym jest to, że za każdym razem gdy znacznik jest dotknął również wyskakuje do przodu kolejność z, która jest sensowna, ponieważ na tym właśnie koncentruje się użytkownik.

+0

Ramin, Dzięki za odpowiedź. Nie sądzę, że to całkiem rozwiązuje mój problem. Objaśnienia nie są wyświetlane nad widokami adnotacji. Potrzebuję również kontrolować tę kolejność z widoków adnotacji bez konieczności dotykania ich przez użytkownika. Niektóre widoki mają wyższy "priorytet" i powinny być wyświetlane nad innymi widokami o niższym priorytecie. – btschumy

+0

Nie wiem, czy to ten sam problem, ale miałem kilka pinezek umieszczonych blisko siebie.Kliknięcie każdego pinezka sprawiłoby, że objaśnienia pojawiłyby się pod pozostałymi pinami, więc wygląda na to, że każdy widok adnotacji zachowuje własną warstwę wywołania. Ale masz rację, objaśnienia powinny znajdować się na osobnej górnej warstwie. Może chcesz zgłosić zgłoszenie błędu. – Ramin

+0

Ramin, Właśnie wypróbowałem Twoje rozwiązanie i rzeczywiście rozwiązuje problem objaśnień, które nie są wyświetlane na wierzchu wszystkich adnotacji. Dzięki. Ciągle pojawia się problem z adnotacją, która nakłada się, gdy się nakładają. Ale to jest mniej ważne niż druga poprawka. – btschumy

7

Ramin, to idealne rozwiązanie dla tego, co próbuję zrobić. Nie zdefiniowałem jednak niestandardowego widoku adnotacji. Rozwiązałem to, używając kategorii i działało idealnie!

Oto nagłówek:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 


@interface MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

i wdrożenie:

#import "AEBMapViewCategory.h" 
@implementation MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Doskonały ... To jest to, co nazywam dobrym kawałkiem kodu. – Biranchi

+0

jak to powinno pasować do mapViewForAnnotations lub, ogólniej, do pozostałej aplikacji mapview? przepraszam, nie jest dla mnie jasne. – si28719e

+0

wow. więc ten rodzaj wydaje się "po prostu działać". co jest dość niesamowite, ale nadal chciałbym wiedzieć "dlaczego". i nie mam pojęcia. – si28719e

6

Spróbuj innego rozwiązania, zPosition konfiguracji widoku opisu warstwy (annotationView.layer.zPosition) w:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) widoki;

+0

Właściwy sposób to zrobić – rmvz3