2012-06-11 10 views
16

Mi piace molto il modo in cui Foursquare ha progettato la vista dei dettagli della sede. Soprattutto la mappa con la posizione della sede nella "testata" di vista ... Come è stato fatto? I dettagli sono ovviamente un po 'di visione utente (forse uitableview?) E dietro di esso (nell'intestazione) c'è una mappa, quindi quando si scorre la mappa viene scoperto mentre la vista di scorrimento rimbalza ... qualcuno ha un'idea di come farlo?Nuova mappa dettagli foursquare

enter image description here

+0

Ho modificato la mia risposta, ora l'implementazione è perfetta;) – yonel

risposta

32

Ecco il modo in cui riesco a riprodurla: -

Avete bisogno di una UIViewController con un UIScrollView come suo punto di vista. Poi, il contenuto del UIView si aggiunge al tuo ScrollView dovrebbe essere simile a questo: -

enter image description here - La cornice del del MKMapView avere un effetto negativo y posizione. In questo caso, possiamo vedere solo 100 punti delle mappe nello stato predefinito (prima del trascinamento).
- È necessario disabilitare lo zoom e lo scorrimento sull'istanza di MKMapView.

Quindi, il trucco è quello di spostare verso il basso il centerCoordinate del MKMapView quando si trascina verso il basso e regolare la sua posizione centrale.

Per questo, calcoliamo la quantità di 1 punto rappresentano come latitudine delta in modo che sappiamo quanto la coordinata centro della mappa dovrebbe essere spostato quando viene trascinato di punti x sullo schermo: -

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

Dopo aver inizializzato tali proprietà, è necessario implementare il comportamento di UIScrollViewDelegate. Quando trasciniamo, convertiamo la mossa espressa in punti in una latitudine. E poi, spostiamo il centro della mappa usando la metà di questo valore.

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

si ottiene lo stesso comportamento come l'applicazione Foursquare (ma meglio: in app Foursquare, il recenter mappe tende a saltare, qui, cambiando il centro è fatto senza problemi).

+0

wow, questa è una risposta incredibile ... grazie mille!scusa per il ritardo quando lo segnava come risolto - ero in vacanza ... comunque ... in realtà l'ho fatto da solo dopo un po 'ed è simile alla tua soluzione ... l'unica differenza era che quando ho fatto scorrere ho rinfrescato tutto mapView, che imposta una nuova regione visibile (se scorri molto la mappa ingrandita) ... mi piace la tua soluzione con appena impostato il nuovo centro della mappa, è molto più veloce della mia soluzione quindi aggiornerò il mio codice ... ancora una volta GRAZIE MOLTO! :) –

+0

Puoi spiegare come si calcola il deltaLatFor1px in viewDidLoad in particolare referencePosition. Ottengo un arresto anomalo dell'app con il codice che dice che c'è un problema con le coordinate geografiche non valide. Grazie! – MrBr

+0

In realtà quello che sto facendo è che creo due posizioni sullo schermo, con 100 pixel tra di esse. Quindi converto quelle posizioni sullo schermo per mappare le posizioni. Quindi so quanta latitudine rappresenta 100 px. E poi è facile sapere quanta latitudine è rappresentata da 1px (latitudine delta tra le 2 posizioni dello schermo divise per 100). – yonel

0

La risposta di Yonel è buona, ma ho trovato un problema perché ho uno spillo al centro della mappa. Poiché la Y negativa, il punto è nascosto sotto la mia UINavigationBar.

Quindi, non ho impostato il negativo Y, e correggo il mio mapView.frame in base allo scroll scroll.

mio MapView è di 320 x 160

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

Spero che questo aiuti qualcuno.

Problemi correlati