Faire pivoter MapView en utilisant l'orientation Compass
-
12-09-2019 - |
Question
Est-il possible d'avoir une rotation de MKMapView
intégré pour faire face à toujours la direction de l'iPhone fait face? Fondamentalement, je veux imiter l'application de la carte fonction de rotation sur mon propre application.
Je vois que l'iPhone SDK ne pas exposer la fonctionnalité. Cependant, je me demande si cela fonctionnerait pour faire pivoter la vue entière à l'aide CGAffineTransformMakeRotate
. Ne serait-il une incidence sur les écoutes et le zoom? Y at-il une meilleure façon?
La solution
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))];
}];
}
Une autre sollution utilise un nouveau procédé qui a été ajouté dans iOS 5 à MKMapView.
Jetez un oeil à: http://developer.apple .com / bibliothèque / ios / # documentation / MapKit / Référence / MKMapView_Class / MKMapView / MKMapView.html
- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;
Autres conseils
Je peux confirmer que cela fonctionne très bien. Voici le code que j'utilise:
[mapView setTransform:CGAffineTransformMakeRotation(-1 * currentHeading.magneticHeading * 3.14159 / 180)];
mapView
est mon exemple MKMapView
Une 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 ceci
public func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading)
{
if(CLLocationCoordinate2DIsValid(mapView.centerCoordinate))
{
mapView.camera.heading = newHeading.trueHeading
}
}
Si vous regardez dans le 3.0 Application iPhone Guide de programmation sous Device Support
vous trouverez des informations sur le magnétomètre (aka boussole). Une fois que vous commencez à obtenir des informations sur le cap (par la méthode de didUpdateHeading
), vous devriez être en mesure d'obtenir les données de la boussole puis utilisez que pour calculer la rotation appropriée transformer la valeur à appliquer à la vue de la carte.
Je ne sais pas si elle gère le zoom. Dans l'application standard de la carte, je l'ai remarqué que le suivi de cap compas arrête dès que vous commencez à pincement zooming.
De plus, gardez à l'esprit que les directions de localisation sont en degrés alors transformer les angles de rotation sont en radians.
si vous utilisez un essayer navigationVontroller:
//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;