Obtenir l'orientation de l'appareil avant de le faire pivoter ou de le forcer au lancement. Des idées?

StackOverflow https://stackoverflow.com/questions/1638690

  •  08-07-2019
  •  | 
  •  

Question

J'ai bientôt une date limite et j'ai un bug très ennuyeux devant moi et aucune idée, comment le réparer. Le problème est que, parfois, le périphérique ne sait pas quelle est son orientation avant d'avoir été pivoté et il gâche donc les cadres dans les instructions conditionnelles:

 if (orient == UIInterfaceOrientationPortrait || orient == 0){ 
  r = CGRectMake(0.0, 0.0, 320.0, 480.0);
        // draw stuff
    } else {
  r = CGRectMake(0.0, 0.0, 480.0, 320.0);
        // draw stuff
    }

Ce bogue peut être facilement reproduit si je garde l'appareil sur la table ou à la main (position horizontale) et si je lance l'application, il dessine des rectangles de type paysage dans un écran de type portrait.

Mes questions sont les suivantes: puis-je obtenir la bonne orientation dans ce genre de situation? Dommage qu'il ne puisse pas être reproduit dans le simulateur, je ne suis donc pas sûr que le code que j'ai collé soit responsable de ce bogue, mais c'est l'endroit où je répare les images en fonction de leur orientation. Peut-être y a-t-il un autre moyen (approprié) de faire cela? Et peut-être que je peux forcer l'application à être en mode portrait jusqu'à ce que l'événement de rotation soit déclenché?

Était-ce utile?

La solution

Je ne pense pas que ce soit un bug. Lorsque l'iPhone est assis sur la table, toute la gravité est mesurée le long de l'axe Z. Pour déterminer l'orientation du périphérique, les axes x-y sont utilisés, mais aucune accélération n'est mesurée à côté d'eux dans votre scénario.

EDIT: Explications supplémentaires:

Cette image montre l'orientation des axes sur l'iPhone: texte alt http://developer.apple. com / iphone / bibliothèque / documentation / UIKit / Référence / UIAcceleration_Class / Art / device_axes.jpg

Ainsi, lorsque l'iPhone est couché sur le dos, une accélération de -1g est appliquée sur l'axe z. Pour recevoir les accélérations mesurées, enregistrez simplement un délégué implémentant UIAccelerometerDelegate avec l'instance partagée UIAccelerometer . Voir le AccelerometerGraph Découvrez comment cela est fait.

Pour déterminer si l'iPhone est assis sur la table, procédez comme suit:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    {

    // lowPass filter first

    // now choose orientation
      if (fabs([acceleration z]) >= 0.9) // sitting on the table: choose new mode or lock current mode
      if (fabs([acceleration y]) >= 0.9) // probably portrait mode
      if (fabs([acceleration x]) >= 0.9) // probably landscape mode

    }

La précision de l’accéléromètre est 18mG = 0.018G , tenez-en compte. De plus, vous devez vous isoler des effets des changements de mouvement instantanés. Un simple filtre LowPass convient parfaitement à cette facture. L’exemple AccelerometerGraph montre comment implémenter un tel filtre.

Choisissez également un updateInterval très bas si vous n'avez pas besoin de beaucoup de précision, 30Hz devrait vous convenir.

Autres conseils

Le capteur qui détermine l'orientation de l'appareil n'est ni infaillible ni intelligent. Si vous posez le téléphone sur la table et que vous le contournez, comment est-il censé savoir qu'il est à l'envers?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top