2014-09-05 1 views
1

Mon application utilise CMMotionManager pour suivre le mouvement du périphérique, mais iOS renvoie toujours les données de mouvement du périphérique dans l'orientation standard du périphérique (bouton d'accueil en bas).Comment ajuster les données CMMotionManager pour l'orientation sous iOS 8?

Pour obtenir les données de mouvement dans la même orientation que mon UIView, j'accumule la vue se transforme de mon point de vue vers le bas à la fenêtre comme ceci:

CGAffineTransform transform = self.view.transform; 
for (UIView *superview = self.view.superview; superview; superview = superview.superview) { 
    CGAffineTransform superviewTransform = superview.transform; 
    transform = CGAffineTransformConcat(transform, superviewTransform); 
} 

Cette transformée obtient calculée correctement sous iOS 6 & 7, mais iOS 8 change le modèle de rotation et maintenant les vues retournent toujours la transformation d'identité (pas de rotation), peu importe comment le périphérique est orienté. Les données du gestionnaire de mouvement est toujours corrigée dans l'orientation standard. La surveillance des notifications de rotation UIDevice et le calcul manuel des quatre transformations semblent être une approche pour obtenir cette transformation sous iOS 8, mais cela semble également mauvais car l'orientation de l'appareil ne correspond pas nécessairement à l'orientation de ma vue (à l'inverse une orientation de l'appareil normalement non prise en charge). Quel est le meilleur moyen d'obtenir la sortie de CMMotionManager dans l'orientation d'un UIView spécifique sous iOS 8?

Répondre

0

Je ne pouvais pas trouver un moyen de calculer directement la transformation, de sorte qu'au lieu que je changé mon code pour calculer définir la transform manuellement lorsqu'un willRotateToInterfaceOrientation: message est reçu dans mon contrôleur de vue, comme ceci:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    CGAffineTransform transform; 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
      transform = CGAffineTransformMake(
       0, -1, 
       1, 0, 
       0, 0); 
      break; 

     case UIInterfaceOrientationLandscapeRight: 
      transform = CGAffineTransformMake(
       0, 1, 
       -1, 0, 
       0, 0); 
      break; 

     case UIInterfaceOrientationPortraitUpsideDown: 
      transform = CGAffineTransformMake(
       -1, 0, 
       0, -1, 
       0, 0); 
      break; 

     case UIInterfaceOrientationPortrait: 
      transform = CGAffineTransformIdentity; 
      break; 
    } 
    self.motionTransform = transform; 
} 
1

Bien que cela ne soit pas très évident, la méthode recommandée dans iOS 8 et versions ultérieures est celle des coordinateurs de transition.

En viewWillTransition(to:with:), le coordonnateur peut vous passer une instance adoptant UIViewControllerTransitionCoordinatorContext dans les blocs d'achèvement de celui des ses méthodes que vous appelez (le coordinateur par défaut utilisé par UIKit est en fait son propre contexte, mais ce n'est pas nécessairement le cas).

La propriété targetTransform du contexte correspond à la rotation à appliquer à l'interface à la fin de l'animation. Notez qu'il s'agit d'une transformation relative, et non de la transformation absolue de l'interface.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 

    let animation: (UIViewControllerTransitionCoordinatorContext) -> Void = { context in 
     // your animation 
    } 

    coordinator.animate(alongsideTransition: animation) { context in 
     // store the relative rotation (or whatever you need to do with it) 
     self.transform = context.targetTransform 
    } 
} 

Alors que l'ancienne approche fonctionne toujours, cette API est probablement plus conforme à l'orientation future des cadres de l'interface utilisateur d'Apple, et il ne permet une plus grande flexibilité lorsque vous avez besoin de contrôler des transitions animées.

+0

Merci pour la perspicacité –

+0

Pas de problème! Si tout va bien, cela aidera les autres à chercher la même chose. –

Questions connexes