Z-ordinamento dei MKAnnotationViews

voti
13

Sto diventando abbastanza frustrato con le limitazioni di MKMapKit. Mio problema attuale ha a che fare con z ordinamento delle viste di annotazione, in particolare per quanto riguarda tocchi. Se si accetta l'ordine z predefinito MapKit ti dà:

  1. L'ordine appare casuale. L'ordine z è correlato all'ordine sono state aggiunte le annotazioni.
  2. Se un'annotazione finisce in cima ad un altro, toccando l'annotazione superiore generalmente porta il richiamo per l'annotazione inferiore. Sembra che il rilevamento colpo non ha nemmeno rispettare l'ordine di visualizzazione. Cosa succede con quello?

Ho provato risolvere # 1 utilizzando qualcosa di simile al seguente codice trovato sul web (che è stato progettato per fornire un certo controllo su z-order)

- (void) MapView: (MKMapView *) MapView didAddAnnotationViews: (*) NSArray viste {
   per (MKAnnotationView * annView nelle viste) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annotazione annView];
      if ([top ann]) {
         [[AnnView superview] bringSubviewToFront: annView];
      } altro {
         [[AnnView superview] sendSubviewToBack: annView];
      }
   }

}

Funzionando attraverso il punto di vista di annotazione passati MapView: didAddAnnotationViews: e regolando il loro ordine z sembra risolvere 1 #. Il problema è che ora i punti di vista callout non sono più sempre in primo piano il punto di vista di annotazione. Il MapKit sembra ottenere molto confuso circa gli strati (didascalie devono essere disegnate in un livello superiore tutte le viste annotazione). Posso anche capire come si sta facendo confusa dal momento che tutti i MKAnnotationViews ricevuti hanno lo stesso superview (una classe privata MKOverlayView). Si potrebbe pensare che tutto il disegno ragionevole trarre le didascalie relative a questa vista di sovrapposizione.

Qualcuno ha risolto # 1 o # 2 con successo?

È pubblicato 05/11/2009 alle 17:04
fonte dall'utente
In altre lingue...                            


3 risposte

voti
8

Se si dispone di un annotationView personalizzato (che suona come avete già) si può provare ad aggiungere questo:

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

Un effetto collaterale è che ogni volta che un marcatore viene toccata anche apre verso la parte anteriore del ordine z, che in realtà è sensibile dato che è ciò che l'utente sta concentrando su.

Risposto il 05/11/2009 a 17:54
fonte dall'utente

voti
7

Ramin, che è perfetto per quello che sto cercando di fare. Non ho avuto una vista annotazione personalizzato definito però. Ho risolto questo utilizzando una categoria e ha funzionato perfetto!

Ecco l'intestazione:

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


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

E l'implementazione:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
Risposto il 04/12/2009 a 19:40
fonte dall'utente

voti
6

Prova zPosition un'altra vista del livello soluzione, messa a punto di annotazione (annotationView.layer.zPosition) a:

(Void) MapView: (MKMapView *) didAddAnnotationViews MapView: (*) NSArray vista;

Risposto il 03/05/2013 a 12:12
fonte dall'utente

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