Z-rekkefølge av MKAnnotationViews

stemmer
13

Jeg får ganske frustrert med begrensningene i MKMapKit. Min nåværende problem har å gjøre med den Z-ordningen annoteringsvisninger synspunkter, særlig når det gjelder detaljer. Hvis du godtar standard z bestille mapkit gir deg:

  1. Ordren vises tilfeldig. Den z-ordre er ikke relatert til den rekkefølge de merknadene ble tilsatt.
  2. Hvis man annotering ender opp på toppen av en annen, berøre toppen annotering vanligvis bringer opp forklaringen til bunnen merknader. Det virker som den populære oppdage ikke engang respekterer uavgjort rekkefølge. Hva skjer med det?

Jeg har prøvd å løse # 1 ved hjelp av noe som ligner på følgende kode funnet på nettet (som er designet for å gi en viss kontroll over z-order)

- (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) visninger {
   for (MKAnnotationView * annView i visninger) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotering];
      if ([ann top]) {
         [[AnnView Super] bringSubviewToFront: annView];
      } Else {
         [[AnnView Super] sendSubviewToBack: annView];
      }
   }

}

Kjører gjennom merknads synspunkter sendes til mapView: didAddAnnotationViews: og justere deres z-order ser ut til å fikse # 1. Problemet er at nå synspunktene til info er ikke lenger alltid på topp til synspunktene merknad. Den MapKit ser ut til å bli veldig forvirret om lagene (bildeforklaringer skal trekkes i et lag over alle merknader utsikt). Jeg kan til og med finne ut hvordan det er å bli forvirret siden alle MKAnnotationViews du får ha den samme Super (en privat klasse MKOverlayView). Du skulle tro enhver rimelig design ville trekke forklaringer om dette overlegget visningen.

Har noen løst # 1 og # 2 med hell?

Publisert på 05/11/2009 klokken 16:04
kilden bruker
På andre språk...                            


3 svar

stemmer
8

Hvis du har en tilpasset annotationView (som høres ut som du allerede har) kan du prøve å legge dette:

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

En bivirkning er at hver gang en markør blir rørt det også kommer til forsiden av z-orden, som faktisk er fornuftig siden det er det brukeren har fokus på.

Svarte 05/11/2009 kl. 16:54
kilden bruker

stemmer
7

Ramin, som er perfekt for det jeg prøver å gjøre. Jeg hadde ikke en tilpasset merknad utsikt definert skjønt. Jeg løste dette ved å bruke en kategori, og det fungerte perfekt!

Her er overskriften:

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


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

Og Gjennomføring:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
Svarte 04/12/2009 kl. 18:40
kilden bruker

stemmer
6

Prøv en annen løsning, oppsett annotering utsikt lagets zPosition (annotationView.layer.zPosition) i:

(Void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) visninger;

Svarte 03/05/2013 kl. 11:12
kilden bruker

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