2012-06-11 7 views
16

Me encanta la forma en que la vista de un lugar diseñado foursquare. Especialmente el mapa con la ubicación del lugar en el "encabezado" de la vista ... ¿Cómo se hizo? Los detalles son obviamente algunos uiscrollview (tal vez uitableview?) Y detrás de ellos (en el encabezado) hay un mapa así que cuando se desplaza hacia arriba el mapa se muestra mientras la vista de desplazamiento rebota ... ¿alguien tiene una idea de cómo hacer esto?Nuevo mapa de detalle de la sede foursquare

enter image description here

+0

He editado mi respuesta, ahora la implementación es perfecta;) – yonel

Respuesta

32

Aquí es como me las arreglo para reproducirlo: -

Se necesita una UIViewController con un UIScrollView como su punto de vista. A continuación, el contenido de la UIView que añadir a su ScrollView debería tener este aspecto: -

enter image description here - El marco de la MKMapView tienen una posición negativa y. En este caso, solo podemos ver 100 puntos de los mapas en el estado predeterminado (antes de arrastrar).
- Debe deshabilitar el acercamiento y el desplazamiento en su instancia de MKMapView.

Luego, el truco es bajar al centerCoordinate del MKMapView cuando arrastra hacia abajo, y ajustar su posición central.

Para ello, se calcula la cantidad de 1 punto representa como una latitud delta para que sepamos cuánto coordinar el centro del mapa debe ser movido al ser arrastrado de los puntos x en la pantalla: -

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIScrollView* scrollView = (UIScrollView*)self.view; 
    [scrollView addSubview:contentView]; 
    scrollView.contentSize = contentView.frame.size; 
    scrollView.delegate = self; 
    center = CLLocationCoordinate2DMake(43.6010, 7.0774); 
    mapView.region = MKCoordinateRegionMakeWithDistance(center, 1000, 1000); 
    mapView.centerCoordinate = center; 
    //We compute how much latitude represent 1point. 
    //so that we know how much the center coordinate of the map should be moved 
    //when being dragged. 
    CLLocationCoordinate2D referencePosition = [mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:mapView]; 
    CLLocationCoordinate2D referencePosition2 = [mapView convertPoint:CGPointMake(0, 100) toCoordinateFromView:mapView]; 
    deltaLatFor1px = (referencePosition2.latitude - referencePosition.latitude)/100; 
} 

Una vez que esas propiedades se inicializan, debemos implementar el comportamiento del UIScrollViewDelegate. Cuando arrastramos, convertimos el movimiento expresado en puntos a una latitud. Y luego, movemos el centro del mapa usando la mitad de este valor.

- (void)scrollViewDidScroll:(UIScrollView *)theScrollView { 
    CGFloat y = theScrollView.contentOffset.y; 
    // did we drag ? 
    if (y<0) { 
     //we moved y pixels down, how much latitude is that ? 
     double deltaLat = y*deltaLatFor1px; 
     //Move the center coordinate accordingly 
     CLLocationCoordinate2D newCenter = CLLocationCoordinate2DMake(center.latitude-deltaLat/2, center.longitude); 
     mapView.centerCoordinate = newCenter; 
    } 
} 

se obtiene el mismo comportamiento que la aplicación Foursquare (pero mejor: en la aplicación en cuadro, el recenter mapas tiende a saltar, aquí, cambiando el centro se hace sin problemas).

+0

wow, esta es una respuesta increíble ... ¡muchas gracias!perdón por el retraso cuando lo marqué como solucionado - estaba de vacaciones ... de todos modos ... en realidad lo hice por mi cuenta después de un tiempo y es similar a su solución ... la única diferencia fue que cuando me desplacé me refresqué todo mapView, que establece una nueva región visible (si se desplaza mucho el mapa se amplió) ... me gusta su solución con solo establecer un nuevo centro del mapa, es mucho más rápido que mi solución, así que actualizaré mi código ... Una vez mas, muchas gracias ! :) –

+0

¿Puede explicar cómo calcula el deltaLatFor1px en viewDidLoad, especialmente la referencePosition? Aparece la aplicación con el código que indica que hay un problema con las coordenadas geográficas no válidas. ¡Gracias! – MrBr

+0

En realidad, lo que hago es crear dos posiciones de pantalla, con 100 px entre ellas. Luego convierto esas posiciones de pantalla a posiciones de mapa. Entonces sé cuánto representa la latitud 100px. Y luego es fácil saber cuánta latitud representa 1px (latitud delta entre las 2 posiciones de pantalla divididas entre 100). – yonel

0

La respuesta de Yonel es agradable, pero encontré un problema ya que tengo un pin en el centro del mapa. Debido a que el Y negativo, el punto está oculto bajo mi UINavigationBar.

Luego, no configuré la Y negativa y corrijo mi mapView.frame de acuerdo con el desplazamiento de desplazamiento.

Mi MAPview es de 320 x 160

_mapView.frame = CGRectMake(0, 160, 320, -160+y); 

Espero que esto ayude a alguien.

Cuestiones relacionadas