sur l'iPhone 3GS dans l'application "Cartes", vous pouvez cliquer sur l'icône qui affiche généralement votre position deux fois et le point bleu gagne ce qui ressemble à une poutre d'un projecteur, vous montrant essentiellement la direction que vous êtes confrontés sur la carte et tournant l'image en conséquence.
Cette option est disponible à l'aide de MapKit MapView? P>
Je sais que je peux obtenir mon en-tête avec quelque chose comme p> // si le La précision est valide, processus de traitement de l'événement. p> } p> mais je ne sais pas comment obtenir ce joli effet de phare dans mapkit et il ne fait pas " Il semble être une documentation. P> Des idées? P> P>
5 Réponses :
Je pourrais penser à une méthode, bien que je n'ai pas implémenté mais peut vous aider un peu. P>
DIDUPDatedheading code> Utilisez les valeurs X et Y pour calculer l'angle de la direction. LI>
- Utilisez cet angle pour faire pivoter l'image du pointeur li>
- Utilisez cette image tournée en tant que code PIN d'annotation dans votre carte. LI>
- vous auriez besoin de mettre à jour la position du pointeur fréquemment. LI>
ol>
Veuillez poster vos suggestions / modifications de l'approche ci-dessus. P>
Les cartes IM ne sont pas le "pointeur" en rotation mais la carte elle-même, le pointeur reste toujours le même pointant vers le haut de votre appareil. Le problème est de mettre à jour la position de l'annotation.
J'ai trouvé une solution:
i Faites pivoter la carte à l'aide des informations de rubrique disponibles avec p> donc le "faisceau" pointe toujours vers le haut de l'appareil. . J'affiche maintenant simplement une vision d'image en haut de la carte et modifier sa position dans EmplacementManager: DidupdateToLocation: FromLocation: P> - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// scroll to new location
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 2000, 2000);
[self.mapView setRegion:region animated:YES];
// set position of "beam" to position of blue dot
self.headingAngleView.center = [self.mapView convertCoordinate:newLocation.coordinate toPointToView:self.view];
// slightly adjust position of beam
self.headingAngleView.frameTop -= self.headingAngleView.frameHeight/2 + 8;
}
La logique rotative des autres réponses sont bonnes, mais s'appuie toutefois sur les méthodes de déléguée de gestion de l'emplacement, ne donnera pas à une bonne solution. L'image "faisceau" sera rarement au même endroit que le point bleu et fera rebondir autour beaucoup.
La meilleure solution consiste à faire référence à la vue Blue Dot et à ajouter l'image "faisceau" sous forme d'une sous-évaluation à cela. Je suis allé avec une image de faisceau qui était un carré, avec la poutre en haut et la transparence tout autour de celle-ci. Imaginez que le point bleu soit au centre de l'image. P>
// An MKMapViewDelegate method. Use this to get a reference to the blue dot annotation view as soon as it gets added - (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views { for (MKAnnotationView *annotationView in views) { // Get the user location view, check for all of your custom annotation view classes here if (![annotationView isKindOfClass:[MKPinAnnotationView class]]) { self.userLocationAnnotationView = annotationView; gotUsersLocationView = YES; } } } // Adds the 'viewPortView' to the annotation view. Assumes we have a reference to the annotation view. Call this before you start listening to for heading events. - (void)addViewportToUserLocationAnnotationView { TTDASSERT(self.userLocationAnnotationView != nil); if (self.userLocationAnnotationView == nil) { // No reference to the view, can't do anything return; } if (self.viewPortView == nil) { self.viewPortView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"map_viewport.png"]] autorelease]; } [self.userLocationAnnotationView addSubview:self.viewPortView]; [self.userLocationAnnotationView sendSubviewToBack:self.viewPortView]; self.viewPortView.frame = CGRectMake((-1 * self.viewPortView.frame.size.width/2) + self.userLocationAnnotationView.frame.size.width/2, (-1 * self.viewPortView.frame.size.height/2) + self.userLocationAnnotationView.frame.size.height/2, self.viewPortView.frame.size.width, self.viewPortView.frame.size.height); }
Ce code fonctionne-t-il pour vous? Je l'ai essayé mais l'emplacement de l'utilisateur AnnotationView reste inchangé.
Où appelez-vous AddviewPortTouserLocationAnnotationview méthode?
Mise à jour: Didaddannotationviews ne me convient pas à l'appareil, mais est appelé sur simulateur et votre solution fonctionne parfaitement sur simulateur. Avez-vous une idée pourquoi?
Je n'ai pas regardé ce code car iOS 5 est sorti, le mien semble toujours fonctionner, mais il pourrait y avoir des différences mineures. Testez-vous sur différentes versions iOS entre l'appareil et les simulateurs?
Ajout du mode de suivi de l'utilisateur aide également. Je sais que je suis en retard, mais éventuellement une aide à d'autres développeurs comme moi :)
Swift 3 implémentation forte>
C'est une bonne question d'identification aime aussi connaître la réponse
Je pense que la réponse est que cela ne peut pas être fait en utilisant MapKit. Je me demande comment des applications comme le géocaching le fait? Ou plutôt, si c'est beaucoup de travail rouler votre propre vue de carte.
Peut être fait en utilisant self.mapview.usertrackingmode = rmusertrackingModeVoyage;