Problema cu adnotări suprapuse (MKAnnotationView) pe hartă

voturi
9

În cererea mea iphone, folosesc MapKit cu MKMapView și personalizate MKAnnotationView.

Problema este atunci când adnotările se suprapun pe hartă (în aplicația mea, adnotări sunt fotografii și acele fotografii se pot suprapune) și atunci când apăsați pe adnotarea care apare în partea frontală, este o altă adnotare (pe spate), care primește evenimentul (pare a fi aleatoare ).

Nu am găsit nici un fel de a trimite evenimentul adnotarea din față. Nu pot să cred că acest bug-ul / problemă nu are nici o soluție!

Z prin care se dispune și de comandă care se suprapun adnotărilor întrebări cu privire la StackOverflow nu mă ajuta atât de mult.

Vă rugăm orice idee este (chiar și soluții murdare) Bine ai venit!

Iată o parte din codul meu (nimic fantezie, foarte frecvente):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

Clasa principală ... // se adaugă adnotările, iar unele dintre ele se suprapune cu alte persoane.

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}
Întrebat 18/03/2010 la 16:07
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
2

În cele din urmă, cel mai bun mod am găsit și care să evite pierderea harta funcionalities este de:

  • lasa ascultatorul atingere pe CustomAnnotationView (touchesEnded) (pe fiecare adnotare)

  • la primirea evenimentului tactil, se transferă evenimentul la clasa principală

  • Clasa principală bucle pe adnotări și păstrează adnotarea care are o locație bună (eveniment de contact din cadrul adnotare) și care se află în fața

Acesta funcționează destul de bine.

Publicat 22/04/2010 la 12:04
sursa de către utilizator

voturi
0

Am adăugat UITapGestureRecognizer la vizualizarea în partea din față și care a rezolvat problema pentru mine.

În cazul tău, adăugând un Recognizer gest pentru CustomAnnotationView ar trebui să rezolve problema.

Publicat 15/12/2011 la 15:04
sursa de către utilizator

voturi
0

Ca urmare a răspunsului lui Alexandre, am dezactivat toate MKAnnotationViews mele personalizate obiecte cu

annView.enabled = NO

astfel încât acestea să nu răspund la comportamentul implicit selectați MKMapView, și implementat în personalizat meu MKAnnotationView următoarele:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

Această soluție funcționează foarte bine pe iOS 4. Se pare ca dezactivarea unei MKAnnotationView nu dezactivează userInteractionEnabled său, în timp ce pe iOS 3 face. Încă caută o soluție pentru iOS 3 ...

EDIT : de fapt, acest lucru pare a fi un bug în iOS 4.1. În iOS 4.2, dezactivarea unui cod PIN dezactivează , de asemenea , evenimentele de atingere. Prin urmare , această metodă funcționează numai pentru 4.1 și , eventual , 4.0.

Publicat 21/10/2010 la 06:47
sursa de către utilizator

voturi
0

A se vedea soluția la această întrebare . Practic veți crea un UIView transparent , care va intercepta toate atinge. Nu l - am încercat, dar acest lucru poate fi mai multe probleme decât merită dacă trebuie să reimplementat toate funcțiile pinch-to-zoom in MKMapView.

Dacă aveți două (sau mai multe) MKAnnotations colocate puteți apăsa în mod repetat pentru a comuta între cele două. Acest lucru ar trebui să funcționeze fără modificări ale aplicației.

Publicat 21/04/2010 la 15:04
sursa de către utilizator

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