web-dev-qa-db-fra.com

Obtenir l'orientation actuelle de l'iPad?

Dans un gestionnaire d'événements donné (pas la méthode "shouldAutorotateToInterfaceOrientation"), comment détecter l'orientation actuelle de l'iPad? J'ai un champ de texte que je dois animer (lorsque le clavier apparaît) dans la vue Paysage, mais pas dans la vue Portrait. Je veux savoir dans quelle orientation je me trouve pour voir si l'animation est nécessaire.

62
MikeN

Les informations d'orientation ne sont pas très cohérentes et il existe plusieurs approches. Si vous êtes dans un contrôleur de vue, vous pouvez utiliser la propriété interfaceOrientation. Depuis d'autres endroits, vous pouvez appeler:

[[UIDevice currentDevice] orientation]

Vous pouvez également demander à recevoir des notifications de changement d'orientation:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];

Certaines personnes aiment également vérifier l’orientation de la barre d’état:

[UIApplication sharedApplication].statusBarOrientation
133
Paul Lynch

Je pense 

[[UIDevice currentDevice] orientation];

n'est pas vraiment fiable. Parfois cela fonctionne, parfois pas ... Dans mes applications, j'utilise 

[[UIApplication sharedApplication]statusBarOrientation]; 

et ça marche très bien!

34
Samuel

Un des:

  • Vérifiez la propriété interfaceOrientation du contrôleur de vue actif.
  • [UIApplication sharedApplication].statusBarOrientation.
  • [UIDevice currentDevice].orientation. (Vous devrez peut-être appeler -beginGeneratingDeviceOrientationNotifications.)
9
kennytm

J'ai trouvé un truc pour résoudre le problème d'orientation FaceUp !!!

Retardez la vérification de l'orientation jusqu'à APRÈS que l'application ait commencé à s'exécuter, puis définissez les variables, la taille des vues, etc.

//CODE

- (void)viewDidLoad {

  [super viewDidLoad];

  //DELAY
  [NSTimer scheduledTimerWithTimeInterval:0.5 
                     target:self 
                     selector:@selector(delayedCheck) 
                     userInfo:nil 
                     repeats:NO];

}


-(void)delayedCheck{

  //DETERMINE ORIENTATION
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){
      FACING = @"PU";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){
      FACING = @"PD";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){
      FACING = @"LL";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){
      FACING = @"LR";
  } 
  //DETERMINE ORIENTATION

  //START
  [self setStuff];
  //START

}


-(void)setStuff{

  if( FACING == @"PU" ){
          //logic for Portrait
  }
  else
  if( FACING == @"PD" ){
          //logic for PortraitUpsideDown
  }
  else{ 
  if( FACING == @"LL"){
          //logic for LandscapeLeft
  }
  else
  if( FACING == @"LR" ){
          //logic for LandscapeRight
  }

}

//CODE

Vous pouvez ajouter des sous-vues, des éléments de position, etc. dans la fonction 'setStuff' ... tout ce qui dépend initialement de l'orientation !!!

:RÉ

-Chris Allinson

8
Chris Allinson

Vous pouvez y parvenir de deux manières:

1- En utilisant la méthode suivante:

** Mettez la ligne suivante dans la méthode -(void)viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];

puis mettez cette méthode dans votre classe

-(void)deviceRotated:(NSNotification*)notification
{

   UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
        //Do your textField animation here
    }
}

La méthode ci-dessus vérifiera l'orientation lors de la rotation de l'appareil

2- La deuxième méthode consiste à insérer la notification suivante dans -(void)viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];

puis mettez la méthode suivante dans votre classe

-(void)checkRotation:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
         //Do your textField animation here
    }
}

La méthode ci-dessus vérifie l’orientation de la barre d’état de l’ipad ou de l’iPhone et vous permet d’effectuer votre animation dans l’orientation requise.

3
Aragon

Pour déterminer paysage par rapport à portrait, il existe une fonction intégrée:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
2
caleb

[UIApplication sharedApplication].statusBarOrientation renvoie portrait lorsque c'est paysage, et paysage quand c'est portrait au lancement, sur iPad

1
Firas KADHUM

Dans votre contrôleur de vue, obtenez la valeur en lecture seule de self.interfaceOrientation (orientation actuelle de l'interface). 

0
Marco

J'ai essayé plusieurs des méthodes ci-dessus, mais rien ne semblait fonctionner à 100% pour moi.

Ma solution consistait à créer une iVar appelée orientation de type UIInterfaceOrientation dans le contrôleur de vue racine.

- (void)viewDidLoad {

    [super viewDidLoad];
    orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use.
}


- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return YES;
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    orientation =  toInterfaceOrientation;

}

Ensuite, n'importe quel endroit où vous devez vérifier l'orientation peut faire quelque chose comme ceci:

 if(UIInterfaceOrientationIsPortrait(orientation)){
    // portrait
  }else{
   // landscape
  }

Il y a peut-être encore un meilleur moyen, mais cela semble fonctionner 98% du temps (malgré iOS5) et ce n'est pas trop difficile. Notez que iOS5 lance toujours l'iPad en mode Portrait, puis envoie à l'appareil les messages willRotateTo- et didRotateFromInterfaceOrientation: la valeur sera donc encore brièvement inexacte.

0
avance

Je ne sais pas pourquoi, mais chaque fois que mon application démarre, les 4 premiers ont raison, mais par la suite, je reçois une orientation opposée. J'utilise une variable statique pour compter cela, puis un BOOL pour inverser la façon dont je l'envoie manuellement aux sous-vues.

Par conséquent, même si je n’ajoute pas de nouvelle réponse individuelle, je vous recommande d’utiliser ce qui précède et de garder cela à l’esprit. Remarque: je reçois l'orientation de la barre d'état, car c'est la seule chose appelée lorsque l'application démarre et qui est "assez adéquate" pour m'aider à déplacer des éléments.

Le principal problème de cette utilisation est que les vues sont chargées paresseusement. Assurez-vous d'appeler la propriété view de vos vues contenues et des vues secondaires "Avant", vous définissez leurs positions en réponse à leur orientation. Merci à Apple de ne pas nous être écrasés lorsque nous avons défini des variables inexistantes, nous obligeant à nous rappeler qu'elles cassent OO et nous obligent à le faire aussi ... ah bon, un système aussi élégant et pourtant tellement cassé! Sérieusement, j'aime les autochtones, mais ce n'est tout simplement pas bon, encourage les OO pauvres conceptions. Ce n’est pas notre faute, nous vous rappelons simplement que votre fonction de redimensionnement fonctionne peut-être, mais Apple Way vous demande de charger la vue en utilisant, et non en la créant et en l’initialisant. 

0
Stephen J