Nuevo map de detalle del lugar foursquare

Me encanta la forma en que los foursquare diseñan la vista de detalle del lugar. Especialmente el map con la location 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 él (en el encabezado) hay un map por lo que cuando se desplaza hacia arriba el map está siendo descubierto cuando la vista de desplazamiento rebota … ¿alguien tiene una idea de cómo hacer esto?

introduzca la descripción de la imagen aquí

Así es como lo consigo para reproducirlo:

Necesita un UIViewController con un UIScrollView como vista. Entonces, el contenido de la UIView que agregue a su scrollview debería verse así:

introduzca la descripción de la imagen aquí – El marco del MKMapView tiene una position negativa y . En este caso, solo podemos ver 100pts de los maps en el estado pnetworkingeterminado (antes de arrastrar).
– Debe desactivar el zoom y el desplazamiento en su instancia de MKMapView.

Entonces, el truco es moverse por el centro del centerCoordinate de MKMapView cuando arrastra hacia abajo y ajustar su position central.

Para eso, calculamos cuánto 1 punto representa como una latitud delta para que sepamos cuánto se debe mover la coorderada central del map cuando se arrastra de x puntos 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 inicializadas esas properties, debemos implementar el comportamiento de UIScrollViewDelegate . Cuando arrastramos, convertimos el movimiento expresado en puntos a una latitud. Y luego, movemos el centro del map 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; } } 

Obtienes el mismo comportamiento que la aplicación foursquare (pero mejor: en la aplicación foursquare, los maps recientes tienden a saltar, aquí, cambiar el centro se realiza sin problemas).

El ejemplo de arriba es bueno. Si necesita más ayuda, creo que están usando algo muy similar a RBParallaxTableViewController. https://github.com/Rheeseyb/RBParallaxTableViewController

Es esencialmente el mismo efecto que Path usa para su foto de encabezado.

La respuesta de Yonel es agradable, pero encontré un problema porque tengo un alfiler en el centro del map. Debido a que la Y negativa, el punto está oculto bajo mi UINavigationBar.

Entonces, no establecí la Y negativa, y corregí mi mapView.frame de acuerdo con el desplazamiento de desplazamiento.

Mi mapView es 320 x 160

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

Espero que esto ayude a alguien.