Problémy s překrývajícími se poznámkami (MKAnnotationView) na mapě

hlasů
9

V mém iPhone aplikaci, já používám MapKit s MKMapView a vlastní MKAnnotationView.

Problém je, když anotace překrývat na mapě (v mé aplikaci, anotace jsou fotky a ty fotky se mohou překrývat) a po klepnutí na poznámku, která se zobrazí na přední straně, je to další anotaci (na zadní straně), který přijímá události (zdá být náhodné ).

Nenašel jsem žádný způsob, jak posílat události na přední anotaci. Nemůžu uvěřit, že tato chyba / problém nemá řešení!

Z uspořádání a pořadí překrývání anotace otázky týkající StackOverflow mě nepomůže, že hodně.

Prosím, nějaký nápad je vítán (i špinavé řešení)!

Zde je několik z mých kód (nic vymyšleného, ​​velmi časté):

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

Hlavní třída ... // se přidávají poznámky a některé z nich se překrývá s ostatními.

- (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;
}
Položena 18/03/2010 v 16:07
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

A konečně, nejlepší způsob, jak jsem zjistil, a že se vyhne ztrátě mapové funcionalities je:

  • nechte dotykové posluchače na CustomAnnotationView (touchesEnded) (na každém anotace)

  • Při příjmu dotekovou událost, převést tuto událost na hlavní třídě

  • Hlavní třída smyčky na anotací a udržuje anotaci, která má dobrou polohu (dotekovou událost v anotaci snímku), a to před

To funguje docela dobře.

Odpovězeno 22/04/2010 v 12:04
zdroj uživatelem

hlasů
0

Přidal jsem UITapGestureRecognizer do pohledu na přední straně a že vyřešil problém pro mě.

Ve vašem případě přidání gesto rozpoznávání do CustomAnnotationView by měl problém vyřešit.

Odpovězeno 15/12/2011 v 15:04
zdroj uživatelem

hlasů
0

V návaznosti na Alexandre odpověď, I zakázáno všechny moje vlastní MKAnnotationViews objekty s

annView.enabled = NO

takže nereagují na MKMapView výchozí vybrané chování a realizovány ve svém zvyku MKAnnotationView následující:

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

Toto řešení funguje skvěle na iOS 4. Vypadá to, že zakázání MKAnnotationView nezakáže jeho userInteractionEnabled, zatímco na iOS 3 to dělá. Stále hledají řešení pro iOS 3 ...

EDIT : ve skutečnosti, to se zdá být chyba v systému iOS 4.1. V systému iOS 4.2 zakázat kolík také zakáže dotekové události. Proto je tato metoda funguje pouze pro 4.1 a případně 4.0.

Odpovězeno 21/10/2010 v 06:47
zdroj uživatelem

hlasů
0

Podívejte se na řešení této otázky . V podstatě budete vytvořit transparentní UIView který zachytí všechny detaily. Nezkoušel jsem to, ale to může být větší problém, než to stojí za to, pokud máte reimplement všechny funkce pinch-to-zoom v MKMapView.

Máte-li dvě (nebo více) MKAnnotations společně umístěného můžete opakovaně klepnutím lze přepínat mezi těmito dvěma. To by mělo fungovat bez jakýchkoliv změn ve vaší aplikaci.

Odpovězeno 21/04/2010 v 15:04
zdroj uživatelem

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