2009-08-07 10 views
6

Est-il possible de faire pivoter MKMapView pour faire face à la direction de l'iPhone? Fondamentalement, je veux imiter la fonction de rotation de l'application Map sur ma propre application.Rotation de MapView en utilisant l'orientation de la boussole

Je vois que le SDK iPhone n'expose pas la fonctionnalité. Cependant, je me demande si cela fonctionnerait pour faire pivoter la vue entière en utilisant CGAffineTransformMakeRotate. Cela affecterait-il le taraudage et le zoom? Y a-t-il un meilleur moyen?

Répondre

11

Pour faire pivoter la Mapview mais pas les annotations que vous pouvez utiliser le code suivant pour compenser la rotation des cartes.

- (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))]; 

    }]; 

} 

autre sollution utilise un nouveau procédé qui a été ajouté dans iOS 5 à MKMapView.

Jetez un oeil à: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

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

+2

Qu'en est-il de l'apport de cette fonctionnalité dans iOS6? Pouvons-nous faire pivoter la carte vers le nord? Je suis tenté d'orienter la carte, mais c'est un échec. – Meera

1

Si vous regardez dans le guide de programmation d'application iPhone 3.0 sous Device Support vous trouverez des informations sur le magnétomètre (aka boussole). Une fois que vous commencez à obtenir des informations de cap (grâce à la méthode didUpdateHeading), vous devriez pouvoir obtenir les données de la boussole, puis l'utiliser pour calculer la valeur de transformation de rotation appropriée à appliquer à la vue de la carte.

Vous ne savez pas s'il gère le zoom. Dans l'application de carte standard, j'ai remarqué que le suivi de la boussole s'arrête dès que vous commencez à effectuer un zoom avant. De plus, gardez à l'esprit que les directions d'emplacement sont en degrés, alors que les angles de rotation des transformées sont en radians.

8

Je peux confirmer que cela fonctionne bien. Voici le code que j'utilise:

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

mapView est mon exemple MKMapView

+1

Les travaux de code ci-dessus faire pivoter la carte, mais qu'en est-il des annotations? Comment la transformation serait-elle appliquée à ceux-là aussi? –

+0

J'ai posté une réponse à votre question ci-dessous. – thijsai

-2

si vous utilisez un navigationVontroller essayez ceci:

//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

solution simple à 3.0 rapide. Assurez-vous de mettre la ligne en mapViewDidFinishLoadingMap ou il ignorera

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

Si vous ne voulez pas la carte à se centrer sur l'emplacement de l'utilisateur que vous pourriez faire quelque chose comme ça

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