prestazioni MapKit Toubleshooting

voti
8

Sto tracciando oltre 500 punti su una mappa tramite MapKit. Lo zoom è un po 'nervosa rispetto alla Google Map app nativa. Ho scoperto che cosa sta causando la lentezza. Sto aggiungendo le annotazioni personalizzate in modo che possa poi aggiungere vari colori pin e pulsanti per le viste di dettaglio:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation {
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@currentlocation];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;
}

Se io commento il codice di cui sopra, tutto funziona bene. Molto liscia con lo zoom in / out. Dovrei essere l'aggiunta di annotazioni in modo diverso per migliorare le prestazioni?

È pubblicato 08/02/2010 alle 03:12
fonte dall'utente
In altre lingue...                            


5 risposte

voti
6

500 annotazioni è probabilmente troppi, ma non così tanti che le prestazioni soffre quando si sta visualizzando solo alcuni di essi. Tuttavia, si dovrebbe utilizzare dequeueing con le annotazioni per migliorare le prestazioni

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *view = nil;
    if (annotation != mapView.userLocation) {
        view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
        if (nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease];
        }
        [view setPinColor:MKPinAnnotationColorGreen];
        [view setCanShowCallout:YES];
        [view setAnimatesDrop:NO];
    }
    else {
        // Do something with the user location view
    }
    return view;
}

Inoltre, con 500 pin, l'animazione goccia richiede molto tempo per terminare. Si dovrebbe trasformare questa via con[view setAnimatesDrop:NO]

Risposto il 08/02/2010 a 06:48
fonte dall'utente

voti
3

Ho scritto un app iPhone per un cliente e abbiamo incluso uno store locator per una delle loro marche di deposito. Esso comprende 501 località e mentre l'animazione può essere un po 'a scatti quando si è ingrandito per visualizzare tutti gli Stati Uniti, è perfettamente bene ingrandita al livello statale, dove solo una manciata di pin sono visibili.

I tasti:

  • Ingrandisci l'utente nella loro posizione corrente prima di aggiungere le proprie annotazioni.
  • Riutilizzare viste di annotazione utilizzando dequeueReusableAnnotationViewWithIdentifier:.

Per raggiungere il primo punto, è necessario attivare gli aggiornamenti di posizione e impostare un flag quando si riceve il primo. Animare la mappa per quella posizione utilizzando un arco regione che ha senso per la vostra applicazione, poi mapView:regionDidChangeAnimated:, verificare se è ancora necessario aggiungere le annotazioni e che la posizione attuale è stato aggiornato prima di chiamare addAnnotation:.

Se non si può o non si vuole lo zoom per la posizione dell'utente, si può filtrare le annotazioni riportate al più alto livello e solo aggiungere annotazioni aggiuntive come l'utente ingrandisce?

A proposito, credo che si ha una perdita di memoria nel codice come pubblicato in precedenza. Anche se non si desidera utilizzare il meccanismo di accodamento, la vista si torna da mapView:viewForAnnotation:dovrebbe essere autoreleased.

Risposto il 10/02/2010 a 16:28
fonte dall'utente

voti
2

Credo St3fan è corretta. In teoria si può solo continuare ad aggiungere annotazioni alla mappa e lasciare che la visualizzazione vista manico di loro, ma la realtà è che è meglio se si mantiene il conto alla rovescia un po ', 500 sullo schermo in una sola volta sarebbe troppo molti a vedere in ogni caso.

Tuttavia, v'è un altro passo per provare - assicurarsi che tutti i punti di vista di annotazione hanno impostato opaca su YES in questo modo:

annView.opaque = YES; 
Risposto il 08/02/2010 a 05:22
fonte dall'utente

voti
1

Se non sta rimuovendo le annotazioni che non si vedevano da parte dell'utente alla vista, che è una cosa da fare per mezzo di MKMapViewDelegate. Se le prestazioni è degradante quando l'utente lo zoom-out per livello nazionale si può decidere di presentare informazioni aggregate sui livelli di zoom> qualche valore const, ad esempio, invece di 30 annotazioni entro 10 miglia quadrate mostrano singola annotazione come [30 something].

Risposto il 29/03/2010 a 15:09
fonte dall'utente

voti
1

Sembra a me che l'aggiunta di 500 punti della mappa ad una sezione di una mappa delle dimensioni dello schermo iPhone non ha senso. Non c'è modo è possibile visualizzare che o addirittura cliccare sul annotazioni destra.

Non puoi guardare il livello di zoom e centro della mappa e poi decidere di aggiungere solo un sottoinsieme di annotazioni alla mappa?

Penso che ho visto altre applicazioni fare anche questo.

Risposto il 08/02/2010 a 04:29
fonte dall'utente

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