10
votes

Calibration Compass Objectif-C

J'essaie d'utiliser Compass dans mon application iOS. Et j'ai un problème avec ça. Si je mettez en place EmplacementManagersHouldDisplayHheadCalibrationCalibration Méthode et Retour Oui , puis l'affichage de calibrage montre toujours. Mais je devrais le faire comme des cartes Apple. C'est à dire. L'affichage d'étalonnage doit être présenté parfois. Lorsque la boussole doit être étalonnée.


4 commentaires

Je ne pense pas que cela soit vrai, j'aime forcer que l'étalonnage est toujours montré, mais il ne sera montré que si le périphérique pense que cela est nécessaire. Quel iOS?


v6 +, et j'utilise des cartes OSM


Mon expérience est si vous êtes à l'extérieur et que vous avez une boussole mécanique, je vois que YPOU doit calibrer l'iPhone à chaque fois que vous l'utilisez. Je tiens donc à forcer la vue d'étalonnage à monter, même lorsque IOS pense que c'est non nécessitant. Mais cela ne fonctionne pas, vous ne pouvez pas le forcer à montrer la fenêtre de Calib. Essayez-le: calibrez-le, puis laissez la vue, entrez à nouveau, voyez-vous la vue de calibrage?


J'ai le problème opposé: la boîte de dialogue d'étalonnage (mise en œuvre exactement comme la vôtre) n'est jamais affichée, même si dans le même endroit (c'est-à-dire assis à mon bureau), l'application "Compass" montre en permanence la boîte de dialogue.


5 Réponses :


7
votes

J'utilise le code suivant:

@property (nonatomic, retain) CLHeading * currentHeading; // Value updated by @selector(locationManager:didUpdateHeading:)
...
...
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
      if( !self.currentHeading ) return YES; // Got nothing, We can assume we got to calibrate.
      else if( self.currentHeading.headingAccuracy < 0 ) return YES; // 0 means invalid heading. we probably need to calibrate
      else if( self.currentHeading.headingAccuracy > 5 )return YES; // 5 degrees is a small value correct for my needs. Tweak yours according to your needs.
      else return NO; // All is good. Compass is precise enough.
}


0 commentaires

15
votes

OK, je ne pouvais pas laisser de commentaire, donc je pensais que je devrais laisser une réponse alors que la réponse de Claude Houle était utile pour moi.

J'utilise cette version améliorée de Claude Houle's Réponse . P>

- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
      if(!manager.heading) return YES; // Got nothing, We can assume we got to calibrate.
      else if(manager.heading.headingAccuracy < 0 ) return YES; // 0 means invalid heading, need to calibrate
      else if(manager.heading.headingAccuracy > 5 ) return YES; // 5 degrees is a small value correct for my needs, too.
      else return NO; // All is good. Compass is precise enough.
}


2 commentaires

Merci pour ça. Il suffit de vérifier mon code et oui, il y avait cette erreur, a mis à jour la réponse. Votre réponse est plus concise (sachant que NULL est 0). Pour un débutant comme moi à l'époque, peut aider à expliquer ces quelques chèques.


Avez-vous déjà vu CaidingCuracy pour être inférieur à 5 lorsque EmplacementManagersHouldDisplayHheadCalibration a été appelé? Je suppose que votre réponse est non, car 5 degrés seraient trop proches de la précision IOS peuvent garantir (sur certains appareils au moins). Je pense que Wim Verhoef a un point valide.



2
votes

Manager.Heading est clip. C'est pourquoi gestionnaire.Heading> 5 donnera un avertissement. Self.currentheading.HeadCacidation> 5 est le vrai.


0 commentaires

5
votes

une solution beaucoup plus simple:

objectif-c xxx

Ceci tire parti du fait que les sélecteurs effectués sur nil Les objets retournent toujours zéro et le fait que la précision ne soit jamais valide et égale à 0,0f (c.-à-d. 100% précis).

Swift En raison de l'introduction d'options, la solution SWIFT la plus simple nécessite une branche et ressemblerait à quelque chose comme suit: xxx

Notez que nous examinons Catégorie , pour laquelle l'état des documents d'Apple:

Une valeur positive dans cette propriété représente l'erreur potentielle entre la valeur rapportée par la propriété magnétrique et le Direction réelle du nord magnétique. Ainsi, la valeur inférieure de cette propriété, plus l'en-tête est précis. Une valeur négative signifie que L'en-tête rapporté est invalide, ce qui peut survenir lorsque l'appareil est non calibré ou il y a une forte interférence de la magnétique locale champs.


0 commentaires

0
votes

sur mon iPhone6 ​​L'accouchement est typiquement 25.0 Donc, il suffit de retourner oui et de s'appuyer sur iOS pour déterminer quand montrer l'écran d'étalonnage semble être la meilleure chose à faire. Jeter les lectures avec une fiducie <0,0 empêche l'utilisation de «mauvais» en-têtes.


1 commentaires

@Jprogrammer Je crois que c'est une réponse et une réponse valable aussi.