2009-08-07 15 views
6

Czy jest możliwe, aby osadzony obrót był obrócony tak, aby zawsze był skierowany w stronę kierunku iPhone'a? Zasadniczo chcę naśladować funkcję obracania mapy mapy w mojej własnej aplikacji.Obracanie mapy przy użyciu orientacji kompasu

Widzę, że iPhone SDK nie eksponuje funkcjonalności. Zastanawiam się jednak, czy to działa, aby obrócić cały widok za pomocą CGAffineTransformMakeRotate. Czy wpłynie to na stukanie i powiększanie? Czy istnieje lepszy sposób?

Odpowiedz

11

Aby obrócić MapView ale nie adnotacje można użyć następującego kodu, aby zrekompensować rotacji map.

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateHeading:(CLHeading *)newHeading 
{ 
    double rotation = newHeading.magneticHeading * 3.14159/180; 
    CGPoint anchorPoint = CGPointMake(0, -23); // The anchor point for your pin 

    [mapView setTransform:CGAffineTransformMakeRotation(-rotation)]; 

    [[mapView annotations] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    MKAnnotationView * view = [mapView viewForAnnotation:obj]; 

    [view setTransform:CGAffineTransformMakeRotation(rotation)]; 
    [view setCenterOffset:CGPointApplyAffineTransform(anchorPoint, CGAffineTransformMakeRotation(rotation))]; 

    }]; 

} 

Innym sollution stosuje się nowy sposób, który został dodany w iOS 5 do MKMapView.

Spójrz: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;

+2

Co przy wprowadzaniu tej funkcji w systemie iOS6? Czy możemy obrócić mapę na północ? Próbuję zorientować mapę, ale to porażka. – Meera

1

Jeśli spojrzysz na Podręcznik programowania aplikacji 3.0 pod numerem telefonu Device Support, znajdziesz informacje na temat magnetometru (czyli kompasu). Gdy zaczniesz otrzymywać informacje o nagłówku (metodą didUpdateHeading), powinieneś być w stanie uzyskać dane z kompasu, a następnie użyć ich do obliczenia właściwej wartości transformacji obrotu, aby zastosować ją do widoku mapy.

Nie wiem, czy obsługuje powiększanie. W standardowej aplikacji do map zauważyłem, że śledzenie nagłówków kompasu zatrzymuje się natychmiast po rozpoczęciu powiększania palcami.

Należy również pamiętać, że kierunki są podane w stopniach, natomiast kąty obrotu przekształcania są w radianach.

8

Mogę potwierdzić, że działa poprawnie. Oto kod, który używam:

[mapView setTransform:CGAffineTransformMakeRotation(-1 * currentHeading.magneticHeading * 3.14159/180)]; 

mapView jest moje wystąpienie MKMapView

+1

Powyższe roboty kod aby obrócić widok mapy, ale co z adnotacjami? W jaki sposób transformacja zostanie zastosowana również do tych transformacji? –

+0

Poniżej zamieszczam odpowiedź na Twoje pytanie. – thijsai

-2

jeśli używasz navigationVontroller spróbuj tego:

//For Left button 
MKUserTrackingBarButtonItem *buttonItem = [[MKUserTrackingBarButtonItem 
               alloc]initWithMapView:_mapView]; 

self.navigationItem.leftBarButtonItem = buttonItem; 


// For Right Button 
    MKUserTrackingBarButtonItem *buttonItem = [[MKUserTrackingBarButtonItem 
                alloc]initWithMapView:_mapView]; 

    self.navigationItem.rightBarButtonItem = buttonItem; 
1

Proste rozwiązanie w szybkim 3,0. Upewnij się, aby umieścić linię mapViewDidFinishLoadingMap lub będzie go zignorować

public func mapViewDidFinishLoadingMap(_ mapView: MKMapView) 
{ 
    mapView.setUserTrackingMode(.followWithHeading, animated: false) 
} 

Jeśli nie chcesz, aby wyśrodkować mapę na lokalizacji użytkownika może zrobić coś takiego

public func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) 
{ 
    if(CLLocationCoordinate2DIsValid(mapView.centerCoordinate)) 
    { 
     mapView.camera.heading = newHeading.trueHeading 
    } 
} 
Powiązane problemy