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?

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top