Z-ordonare a MKAnnotationViews

voturi
13

Primesc destul de frustrat cu limitările de MKMapKit. Problema mea actuală are de a face cu z ordonarea de opinii adnotare, în special în care se referă la atingeri. Dacă acceptați implicit z ordinea în care mapkit vă oferă:

  1. Ordinea apare aleator. Z ordinea nu are legătură cu ordinea au fost adăugate adnotări.
  2. Dacă o adnotare se termină pe partea de sus a unui alt una, atingând adnotarea sus aduce în general în sus înștiințări adnotarea jos. Se pare ca a lovit chiar și detectarea nu respectă ordinea de desenare. Ce-i cu aia?

Am încercat rezolvarea # 1 folosind ceva similar cu următorul cod găsit pe web (care a fost proiectat pentru a oferi un anumit control asupra ordinea z)

- (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) vizualizări {
   pentru (MKAnnotationView * annView vizualizări) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView adnotare];
      if ([ann sus]) {
         [[AnnView Superview] bringSubviewToFront: annView];
      } Else {
         [[AnnView Superview] sendSubviewToBack: annView];
      }
   }

}

Rularea prin punctele de vedere adnotare trecut la mapView: didAddAnnotationViews: și ajustarea lor ordinea z pare să se stabilească # 1. Problema este că acum punctele de vedere înștiințări nu mai sunt întotdeauna pe partea de sus pentru punctele de vedere adnotată. MapKit pare a obține foarte confuz cu privire la straturile (înștiințări ar trebui să fie trase într-un strat de mai sus toate punctele de vedere adnotare). Pot să dau seama cum chiar ea este obtinerea confundat, deoarece toate MKAnnotationViews le primiți au aceeași SuperView (o clasă privată MKOverlayView). Te-ar crede orice design rezonabil ar trage înștiințările despre acest punct de vedere suprapunere.

Are cineva rezolvat # 1 sau # 2 cu succes?

Întrebat 05/11/2009 la 17:04
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
8

Dacă aveți un annotationView personalizat (care sună ca ai deja), puteți încerca să adăugați acest lucru:

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

Un efect secundar este faptul că de fiecare dată când un marker este atins, de asemenea, apare în partea din față a z ordinea, care de fapt este sensibil deoarece aceasta este ceea ce utilizatorul se concentrează pe.

Publicat 05/11/2009 la 17:54
sursa de către utilizator

voturi
7

Ramin, care este perfect pentru ceea ce am încercat să fac. Nu am avut o vedere personalizată adnotare definită, totuși. Am rezolvat acest lucru folosind o categorie si a functionat perfect!

Aici este antetul:

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


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

Și implementare:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
Publicat 04/12/2009 la 19:40
sursa de către utilizator

voturi
6

Încercați zPosition o altă vedere în strat soluție, configurare adnotărilor (annotationView.layer.zPosition) în:

(Void) mapView: (MKMapView *) didAddAnnotationViews mapView: (NSArray *) punctele de vedere;

Publicat 03/05/2013 la 12:12
sursa de către utilizator

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