2010-05-27 8 views
3

Comment puis-je détecter le début d'une rotation et la fin de la rotation sur ces appareils? Donc, après vos réponses, comment puis-je détecter le début et la fin du changement d'orientation.Rotation iPhone/iPad

+0

prévoyez-vous sur le test de ce dans un vaisseau spatial faire une accélération de 1 g? –

+0

Jetez un oeil à ma réponse à http://stackoverflow.com/questions/2489845/rotate-uiviewcontroller-to-counteract-changes-in-uiinterfaceorientation/2490719#2490719 –

+0

Merci pour ce lien! –

Répondre

9

Vous pouvez implémenter les deux méthodes suivantes dans votre UIViewController.

Pour détecter un début de rotation, implémentez willRotateToInterfaceOrientation:duration: et de détecter l'implémentation finale didRotateFromInterfaceOrientation:.

à savoir

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    NSLog(@"I am starting to rotate"); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    NSLog(@"I have finished rotating"); 
} 
+0

Merci pour votre aide. :) –

+0

ne semble pas fonctionner dans iOS 7. – GeneralMike

0

Vous pouvez utiliser le UIAccelerometer api pour cette

EDIT pour correspondre à la clarification de la question:

Utilisez les api UIAccelerometer pour cela. Il y a un bon exemple d'application appelé AccelerometerGraph qui affiche les 3 vecteurs d'accélération sur un graphique. Cela devrait vous donner une bonne indication sur la façon dont un changement d'orientation va ressembler.

+0

Non, vous ne pouvez pas. L'accéléromètre ne détecte pas de rotation. –

+0

Cela dépend de la rotation de l'appareil autour d'un axe passant par lui-même ou non. Il est vrai que vous ne pouvez pas le détecter comme une rotation directe, mais que chacun des axes x, y et z aura des valeurs d'accélération différentes qui pourraient être utilisées pour le détecter. –

+0

@ Claus, sans connaître l'orientation a priori, il est impossible (dans un sens très profond d'Einstein) de distinguer entre le mouvement circulaire et l'accélération. –

0

Vous ne pouvez pas détecter de rotation sur l'un de ces périphériques. L'accéléromètre ne détecte que les changements de vélocité.

Vous pouvez obtenir une mesure d'orientation brute à partir de la classe CLLocationManager, qui signale un en-tête. Cette valeur est lente à mettre à jour, ce qui limite son utilité.

+0

Eh bien, à proprement parler, l'accéléromètre rapporte les forces influençant l'appareil dans les trois axes mesurés en G. Donc, si vous avez l'appareil posé à plat sur une table, vous obtiendrez une valeur z constante sur l'axe z comme - 1 G. Cela ne signifie pas que l'appareil accélère avec 9,8 m/s^2 à travers le tableau :-) –

+0

@Claus, l'accélération et la gravité sont des concepts identiques. Vous ne pouvez pas distinguer l'un de l'autre. Si le téléphone était dans l'espace avec un tout petit paquet de jet sur son dos, en le poussant vers l'avant à 1 G, l'accéléromètre mesurerait -1 G dans la direction Z, comme dans votre scénario. Cela signifie que dans les deux cas, le téléphone accélère _forward_ à 1 G (pas en arrière). Puisque la terre est un peu massive, elle tord l'espace-temps vers lui de telle sorte que l'accélération de 1 G vers l'extérieur tout en étant à plat sur la table maintient le téléphone à une distance fixe du centre de la terre. –