Comment garder un UIView pointant dans une certaine direction quelle que soit l'orientation de l'appareil?

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

Question

J'ai un UIView que je veux toujours vers le haut. dire que vous avez un UIImageView qui a une flèche, et peu importe de quelle façon le dispositif est maintenu, il est pointant vers le haut. Il est évident que je dois l'accéléromètre, mais lui disant de faire pivoter l'image à partir des coordonnées ne va travailler la première fois que je pense, puisque les rotations sont relatives. Y at-il un moyen plus facile de le faire? Je me sens comme il y aurait un simple exemple quelque part app qui ferait quelque chose comme ça.

Était-ce utile?

La solution

Apple a un exemple de code qui fait exactement ce que vous voulez; un coup d'oeil à ceci: http://developer.apple. com / bibliothèque / ios / # SampleCode / WhichWayIsUp / introduction / intro.html

Pour recevoir des données de mouvement spécifiques, utilisez l'instance commune de UIAccelerometer et délégué de lui. http : //developer.apple.com/library/ios/documentation/UIKit/Reference/UIAccelerometerDelegate_Protocol/UIAccelerometerDelegate/UIAccelerometerDelegate.html#//apple_ref/occ/intf/UIAccelerometerDelegate

En ce qui concerne les rotations, je ne suis pas sûr. Jetez un oeil à l'exemple de code "BubbleLevel" ici: http://developer.apple.com/library/ios/samplecode/BubbleLevel/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007331

Les références de documentation délégué accéléromètre et d'autres exemples de code correspondant.

Autres conseils

WhichWayIsUp est l'exemple d'application que vous cherchez - (! grands docs) dans iOS Reference Library

Transforms appliquée à vue ne sont pas cumulables. Au contraire, l'affichage commence étant aligné sur le système de coordonnées de son parent, et la transformation est appliquée par rapport à cela.

Comme d'autres réponses ont fait allusion, il y a des morceaux assez en BubbleLevel exemple de code d'Apple pour accomplir ce que vous cherchez. -[LevelViewController accelerometer:didAccelerate:] contient déjà un exemple de la façon d'extraire la composante de rotation de l'écran-par rapport lissée du vecteur de gravité:

// Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
accelerationX = acceleration.x * kFilteringFactor + accelerationX * (1.0 - kFilteringFactor);
accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor);

// keep the raw reading, to use during calibrations
currentRawReading = atan2(accelerationY, accelerationX);

Étant donné les coordonnées de systèmes UIAcceleration et < a href = « http://en.wikipedia.org/wiki/Atan2 » rel = « nofollow »> atan2 , il y a quelques facteurs que vous aurez besoin de garder à l'esprit pour calculer la rotation souhaitée de votre point de vue:

  1. Lorsque le dispositif est en position verticale en mode portrait, atan2 retourne -p / 2 (-90 °), étant donné que le vecteur de gravité d'entrée est {0,0, -1,0, 0,0}.
  2. CGAffineTransformMakeRotation crée une transformation qui va tourner dans le sens horaire (sur iOS) par le nombre de radians est spécifié, mais l'angle brut à partir atan2 une rotation précise dans le sens antihoraire.

Par conséquent, vous aurez envie de faire pivoter la vue par - (currentRawReading + p / 2), en supposant sa vue parent est orienté avec l'écran en mode portrait:

view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top