rendimiento MapKit Toubleshooting

votos
8

Estoy trazando más de 500 puntos en un mapa mediante MapKit. El zoom es un poco nerviosa en comparación con el mapa de google aplicación nativa. He descubierto lo que está causando la lentitud. Estoy agregando anotaciones personalizadas para que más tarde pueda añadir colores diferentes pines y botones de vistas de detalle:

- (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;
}

Si comento hacia fuera el código anterior, todo funciona bien. Muy suave con el zoom in / out. Debería ser la adición de anotaciones de forma diferente para mejorar el rendimiento?

Publicado el 08/02/2010 a las 03:12
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
6

500 anotaciones es probablemente demasiado muchos, pero no tantos que el rendimiento se resiente cuando sólo se está viendo algunos de ellos. Sin embargo, usted debe utilizar desencolado con sus anotaciones para mejorar el rendimiento

- (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;
}

También, con 500 pines, la animación gota tarda mucho tiempo para terminar. Usted debe apagar eso con[view setAnimatesDrop:NO]

Respondida el 08/02/2010 a las 06:48
fuente por usuario

votos
3

Escribí un iPhone aplicación para un cliente y hemos incluido un localizador de tiendas para una de sus marcas de la tienda. Incluye 501 localidades y mientras que la animación puede ser un poco bruscos cuando has alejado para ver todos los Estados Unidos, que está perfectamente bien el zoom a nivel estatal, donde sólo un puñado de clavijas son visibles.

Las llaves:

  • Amplía el usuario en su ubicación actual antes de agregar anotaciones.
  • Reutilizar vistas de anotación utilizando dequeueReusableAnnotationViewWithIdentifier:.

Para lograr el primer punto, es necesario activar las actualizaciones de ubicación y establecer un indicador cuando se recibe la primera. Animar el mapa para esa ubicación usando un lapso región que tiene sentido para su aplicación, a continuación, en mapView:regionDidChangeAnimated:, comprobar para ver si usted todavía tiene que añadir anotaciones y que la ubicación actual se ha actualizado antes de llamar addAnnotation:.

Si usted no puede o no quiere hacer un zoom a la ubicación del usuario, se puede filtrar las anotaciones que aparecen en el nivel más alto y sólo añadir anotaciones adicionales a medida que el usuario se acerca?

Por cierto, creo que usted tiene una pérdida de memoria en el código tal como fue anunciado anteriormente. Incluso si usted no desea utilizar el mecanismo desencola, la vista regrese de mapView:viewForAnnotation:debe autoreleased.

Respondida el 10/02/2010 a las 16:28
fuente por usuario

votos
2

Creo St3fan es correcta. En teoría sólo se puede seguir añadiendo anotaciones al mapa y dejar que la visualización de la vista mango de ellos, pero la realidad es que es mejor si se mantiene la cuenta atrás un poco, 500 en pantalla a la vez sería demasiado muchos a ver de todos modos.

Sin embargo, hay un paso más para tratar - asegurarse de que todos los puntos de vista de anotación tienen conjunto opaco a la SI de este modo:

annView.opaque = YES; 
Respondida el 08/02/2010 a las 05:22
fuente por usuario

votos
1

Si no está quitando las anotaciones no vistos por el usuario de la vista, que es una cosa que hacer por medio de MKMapViewDelegate. Si el rendimiento se degrada cuando el usuario de alejamiento a nivel de los países es posible que desee presentar información agregada sobre los niveles de zoom> algún valor constante, por ejemplo, en lugar de 30 anotaciones dentro de 10 millas cuadradas muestran sola anotación como [30 something].

Respondida el 29/03/2010 a las 15:09
fuente por usuario

votos
1

Me suena que la adición de 500 puntos del mapa a una sección de un mapa del tamaño de la pantalla del iPhone no tiene sentido. No hay manera de que se puede visualizar o incluso haga clic en la anotación correcta.

¿No puedes ver el nivel de zoom y el centro del mapa y luego decidir sólo para añadir un subconjunto de anotaciones al mapa?

Creo que he visto en otras aplicaciones también lo hacen.

Respondida el 08/02/2010 a las 04:29
fuente por usuario

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