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
Respuesta
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: -
- 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).
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 ! :) –
¿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
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
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.
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.
- 1. API de Foursquare para error de imagen de usuario de sede
- 2. sede de varias páginas en nodejs
- 3. ¿Cómo agrega foursquare una anotación de imagen personalizada en su mapa de Open Graph?
- 4. FourSquare Lugares API
- 5. ¿Cuál es la diferencia entre Bitmap.Clone() y el nuevo mapa de bits (mapa de bits)?
- 6. Cómo integrar Foursquare en Android
- 7. Preservar los valores de mapa de bits al crear un nuevo mapa de bits desde System.Drawing.Image
- 8. archivo Python modos de detalle
- 9. Cómo aumentar la altura de la banda de detalle dinámicamente
- 10. ¿Cómo puedo ver un lugar de Foursquare para check-ins?
- 11. Foursquare: Fotos en lugares/fotos pero no en lugares/explorar?
- 12. detalle amovible estructura gridview
- 13. Android Detalle Maestro
- 14. Algoritmo de nivel 2D de detalle (LOD)
- 15. ¿Cuál es la definición de un detalle de implementación?
- 16. Dos preguntas acerca de la plantilla de flujo maestro/detalle
- 17. copiar el contenido de un mapa inmutable al nuevo mapa mutable
- 18. AutoMapper: Mapa de la DTO de nuevo a objeto de dominio con los objetos secundarios
- 19. Banda de detalle múltiple en JasperReports
- 20. Cómo restar una lista de claves de mapa de otra y obtener un mapa nuevo (mapa A - mab B = mapa C)
- 21. Django aplicación de administración para la página principal/detalle
- 22. La pila es un detalle de implementación, ¿o no?
- 23. Cómo está implementado el detalle de la aplicación iPhone Contact
- 24. nuevo mapa de bits cambió la copia de encendido utilizando tampón
- 25. Haskell cuantificación existencial en detalle
- 26. ¿Dónde puedo aprender Pepino en detalle?
- 27. ¿Cuál es la mejor manera de ajustar mis consultas de búsqueda de Foursquare API?
- 28. ¿Cómo generar un nuevo mapa para jvectormap jquery plugin?
- 29. Página de detalle de aplicaciones de inicio de Android
- 30. Cómo cambiar el color del botón de divulgación de detalle para la celda de la tabla
He editado mi respuesta, ahora la implementación es perfecta;) – yonel