ios - Nuevo mapa detallado del lugar de foursquare
xcode uiscrollview (3)
El ejemplo anterior es agradable. 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 utiliza Path para su foto de encabezado.
Realmente me encanta la forma en que Foursquare diseñó la vista detallada del lugar. 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 (¿quizás uitableview?) Y detrás de él (en el encabezado) hay un mapa, de modo que cuando se desplaza hacia arriba, el mapa se está descubriendo a medida que la vista de scroll rebota ... ¿Alguien tiene una idea de cómo hacerlo?
Esta es la forma en que me las arreglo para reproducirlo:
Necesita un UIViewController
con un UIScrollView
como su vista. Luego, el contenido de la vista UIView
que agregue a su vista de desplazamiento debería verse así:
- El marco del MKMapView
tiene una posición y
negativa . En este caso, solo podemos ver 100pts de los mapas en el estado predeterminado (antes de arrastrar).
- Debe desactivar el zoom y el desplazamiento en su instancia de MKMapView.
Luego, el truco consiste en mover hacia abajo la centerCoordinate
de MKMapView
cuando arrastra hacia abajo y ajustar su posición central.
Para eso, calculamos cuánto representa 1 punto como una latitud delta para saber cuánto se debe mover la coordenada central del mapa 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 que se inicializan esas propiedades, necesitamos implementar el comportamiento de 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;
}
}
Obtienes el mismo comportamiento que la aplicación foursquare (pero mejor: en la aplicación foursquare, los mapas más recientes tienden a saltar, aquí, cambiar el centro se hace sin problemas).
La respuesta de Yonel es agradable, pero encontré un problema porque tengo un pin en el centro del mapa. Debido a la Y negativa, el punto está oculto bajo mi barra de UINavigation.
Entonces, no configuré la Y negativa, y corrijo mi mapView.frame según el desplazamiento del desplazamiento.
Mi mapView es 320 x 160
_mapView.frame = CGRectMake(0, 160, 320, -160+y);
Espero que esto ayude a alguien.