7
votes

Rotate MAPView à l'aide de l'orientation de Compass

est-il possible d'avoir un MKMAPView faire face à toujours la direction de l'iPhone est confronté? Fondamentalement, je veux imiter la fonctionnalité de rotation de la carte de la carte sur ma propre application.

Je vois que l'iPhone SDK n'expose pas la fonctionnalité. Cependant, je me demande si cela fonctionnerait pour faire pivoter toute la vue en utilisant cgaffineransformMakerotate . Cela affecterait-il la prise et le zoom? Y a-t-il une meilleure façon?


0 commentaires

5 Réponses :


1
votes

Si vous regardez dans le Guide de programmation de l'application iPhone 3.0 sous Support de périphérique Vous trouverez des informations sur le magnétomètre (AKA Compass). Une fois que vous avez commencé à obtenir des informations sur la rubrique (via la méthode DIDUPDateDeading ), vous devez être capable d'obtenir les données de Compass, puis utilisez-la pour calculer la valeur de transformation de rotation appropriée à appliquer à la vue Carte.

Je ne sais pas si cela gère le zoom. Dans l'application Carte standard, j'ai remarqué que le suivi de la rubrique Compass s'arrête dès que vous commencez à pincer le zoom.

Aussi, gardez à l'esprit que les directions de localisation sont en degrés alors que les angles de rotation transforment sont des radians.


0 commentaires

8
votes

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

mapview est mon instance mkapview


2 commentaires

Le code ci-dessus fonctionne pour faire pivoter la carte, mais qu'en est-il des annotations? Comment la transformation serait-elle appliquée à ceux-ci aussi?


J'ai posté une réponse pour votre question ci-dessous.



13
votes

Pour faire pivoter le MAPView mais non 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))];

  }];

}


1 commentaires

Qu'en est-il d'apporter cette fonctionnalité dans iOS6? Pouvons-nous faire pivoter la carte nord orientée? J'ai essayé d'orienter la carte, mais c'est un échec.



-2
votes

Si vous utilisez une 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;


0 commentaires

2
votes

Solution simple à Swift 3.0. Assurez-vous de mettre la ligne dans mapviewDidfinishloadingMap code> ou il l'ignorera xxx pré>

si vous ne voulez pas que la carte soit centrée sur l'emplacement de l'utilisateur, vous pourriez faire quelque chose comme CETTE P>

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


0 commentaires