Z-ordering van MKAnnotationViews

stemmen
13

Ik krijg nogal gefrustreerd door de beperkingen van MKMapKit. Mijn huidige probleem heeft te maken met de z-ordening van standpunten annotatie, in het bijzonder als het gaat om details. Als u de standaard z-order accepteren de mapkit geeft u:

  1. De volgorde willekeurig lijkt. De z-volgorde staat los van de volgorde waarin de annotaties toegevoegd.
  2. Als een annotatie eindigt boven een andere, gelijk aan de bovenste annotatie brengt doorgaans het highlight voor de onderste annotatie. Het lijkt alsof de hit detectie niet eens de loting orde respecteren. Hoe zit het daarmee?

Ik heb geprobeerd het oplossen van # 1 met behulp van iets wat lijkt op de volgende code vinden op het web (die werd ontworpen om enige controle over z-bestelling)

- (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) bekeken {
   voor (MKAnnotationView * annView in views) {
      TopBottomAnnotation ann * = (TopBottomAnnotation *) [annView annotatie];
      if ([ann top]) {
         [[AnnView superview] bringSubviewToFront: annView];
      } Else {
         [[AnnView superview] sendSubviewToBack: annView];
      }
   }

}

Het doornemen van het uitzicht annotatie doorgegeven aan mapView: didAddAnnotationViews: en de aanpassing van hun z-order lijkt te bevestigen # 1. Het probleem is dat nu de standpunten bijschrift niet langer altijd op de top om van het uitzicht annotatie. De MapKit lijkt erg in de war over de lagen (bijschriften moet in een laag boven alle standpunten annotatie worden getrokken) te krijgen. Ik kan zelfs erachter te komen hoe het wordt verward omdat alle MKAnnotationViews u ontvangt dezelfde superview (een privé-klasse MKOverlayView). Je zou denken dat elk redelijk ontwerp zou de bijschriften te trekken over deze overlay view.

Heeft iemand opgelost # 1 of # 2 met succes?

De vraag is gesteld op 05/11/2009 om 17:04
bron van user
In andere talen...                            


3 antwoorden

stemmen
8

Als u een aangepaste annotationView (dat klinkt alsof je al hebt) je kunt proberen het toevoegen van deze:

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

Een neveneffect is dat elke keer dat een merker is ook aangeraakt springt naar de voorkant van de z-volgorde, die in feite is zinvol aangezien dat wat de gebruiker richt.

antwoordde op 05/11/2009 om 17:54
bron van user

stemmen
7

Ramin, die perfect is voor wat ik probeer te doen. Ik heb niet een aangepaste annotatie uitzicht hoewel gedefinieerd. Dit heb ik opgelost met behulp van een categorie en het werkte perfect!

Hier is de header:

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


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

En de uitvoering:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
antwoordde op 04/12/2009 om 19:40
bron van user

stemmen
6

Probeer een andere oplossing, setup annotatie view laag's zPosition (annotationView.layer.zPosition) in:

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

antwoordde op 03/05/2013 om 12:12
bron van user

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