12
votes

Comment détecter l'orientation de l'iPhone avant de faire pivoter

Dans mon programme, je déplace les choses en fonction de la rotation, mais je ne fais pas tourner toute la vue. J'utilise:

  static UIDeviceOrientation previousOrientation = UIDeviceOrientationPortrait;

 - (void)applicationDidFinishLaunching:(UIApplication *)application {   
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
    [[NSNotificationCenter defaultCenter] addObserver:self
           selector:@selector(didRotate:)
           name:@"UIDeviceOrientationDidChangeNotification" object:nil];

}

- (void) didRotate:(NSNotification *)notification{  
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    [self doRotationStuff:orientation: previousOrientation];
previousOrientation = orientation;

} 


0 commentaires

7 Réponses :


3
votes

mis à jour: strong>

Donc, à partir de la discussion de commentaire, il apparaît que vous ne pouvez pas compter sur [Uidevice courantDevice] .Orientation code> jusqu'à ce que l'orientation change effectivement la première fois. Si tel est le cas, vous pouvez probablement le pirater en obtenant des lectures d'accéléromètre brutes. P> xxx pré>


réponse originale: strong>

[Uidevice CurrentDevice] .Orientation Code> Renvoie la bonne orientation pendant ApplicationDidFinishLaunching: code>? Si tel est le cas, vous pouvez configurer votre UI initiale en fonction de cette orientation. P>

Si cette propriété ne se définit pas tant que vous pouvez essayer plus tard, vous pouvez essayer d'expérimenter avec performalector: AfterDelay: Code > Pour initialiser l'interface utilisateur après un petit retard. p>

Cet exemple de code est de la réponse de Kendall ci-dessous, ajouté ici pour complétude: P>

[self performSelector:@selector(getOriented) withObject:nil afterDelay:0.0f];


6 commentaires

Pendant l'applicationDiderfinishLaunching, [Uidevice CurrentDevice] .Orientation est UideviceSorientationnnown


Je suis désemparé de la manière dont j'utiliserais SpectiveSelector: AfterDelay. Pouvez-vous donner un exemple de code?


J'ai essayé ce que vous avez dit, mais même [Self PerfactSelector: @Selector (getoriented) withObject: NIL AfterDelay: 10.0f]; n'a eu aucun effet


Qu'entendez-vous par «n'a eu aucun effet»? Voulez-vous dire que c'est toujours uideviceorientationnknown après le délai? Vous devrez peut-être appeler [[Uidevice CurrentDevice] BegingeneratingDeviceSorationationNotifications] Lors du lancement pour vous assurer que l'orientation est mise à jour.


Oui, je veux dire que c'est toujours UideviceSorientationnownown après le délai. [[Uidevice CurrentDevice] BegingeneratingDeviceDeNotifications] est appelée ApplicationDIdFinishLaunching: (uiapplication *) Application {suggérez-vous que j'ai besoin de l'activer plus tôt?


On dirait que c'est peut-être que ce n'est tout simplement pas possible de compter sur la propriété d'orientation de Uidevice jusqu'à ce que l'orientation change effectivement. Ce serait un bummer (vous voudrez peut-être déposer une demande de bug / d'amélioration avec Apple). En attendant, vous pouvez vous inscrire à des notifications d'accéléromètre brutes et pirater cela de cette façon (attendez-vous 10 mises à jour rapides et basez votre orientation initiale à ce sujet).



-1
votes

En réponse à votre commentaire, je pensais pouvoir mieux mettre du code ici que dans un commentaire (bien que vraiment Daniel mérite le crédit ici):

dans ApplicationDidFinishLaunching: P>

- (void) getOriented 
{ 
   UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
   // save orientation somewhere
}


3 commentaires

J'ai essayé ce que vous avez dit, mais même [Self PerfactSelector: @Selector (getoriented) withObject: NIL AfterDelay: 10.0f]; N'a eu aucun effet


Quelle a été l'orientation quand elle a été appelée dix secondes plus tard? On dirait qu'après dix secondes, l'orientation doit être réglée ... ou à ce moment-là, demandez simplement au contrôleur d'affichage principal quelle est son orientation.


c'était uideviceorientationnknown



1
votes

Mort, ces réponses semblent un peu un hareng rouge; Je ne vois pas pourquoi vous ne pouvez pas utiliser la méthode intégrée suivante pour une classe UIViewController: xxx

Cette méthode est appelée automatiquement une fois qu'une rotation s'est produite (plutôt qu'avec datautorotateTerfaceorientation. vous dit qu'il est sur le point d'arriver). Handly, la variable 'DeLInterFaceOrientation' contient l'orientation précédente. Comme la documentation le dit également, vous pouvez supposer que la propriété InterfaceSorientation de la vue a déjà été définie sur la nouvelle orientation, de sorte que vous avez ensuite une méthode avec accès à l'ancienne orientation et au nouveau!

si je «Quelque chose manquait quelque chose et vous avez déjà été renvoyé à pouvoir utiliser cette méthode, mes excuses! Il semble tout simplement étrange que vous créez et stocke une variable pour l'orientation précédente lorsqu'il est fourni gratuitement dans la méthode ci-dessus.

espère que cela aide!


1 commentaires

Cela fonctionnerait si je prévoyais de faire tourner l'interface, que je ne veux pas faire.



0
votes

Un exemple plus complet sur la manière d'obtenir l'orientation des périphériques des lectures d'accélérateur peut être trouvée Voici Comme la solution s'appuie sur les lectures d'accélérateur, cela ne fonctionnerait pas sur le simulateur, vous devrez donc travailler sur l'appareil ... toujours à la recherche de moi pour une solution qui fonctionne sur le simulateur.


0 commentaires

12
votes

Selon votre situation, une option plus simple peut être la propriété interfaceCorientation de la classe UIViewController. Ceci est correct avant une rotation.


2 commentaires

Merci! Je ne savais pas que le champ HTAT existait - j'utilisais l'orientation de Uidevice, qui n'était pas très utile.


C'est pourquoi *** s.o rochers! *** ... allait nugging futz essayant de résoudre une * la toux * Problème d'orientation simple ... Aucun indice ... La recherche présente la réponse de Delany.



1
votes

Utilisez ceci pour l'orientation de l'interface utilisateur si vous devez déterminer quelle manière faites-vous pointer votre façon.

pas sûr de 100% c'est vrai mais en descendant du haut de ma tête: p>

[[[UIApplication sharedApplication] statusBar] orientation]


0 commentaires

1
votes

Voici un moyen d'obtenir l'orientation lorsque l'application Première charge et l'UideviceOrientation est définie sur UideviceOrientationnnown. Vous pouvez regarder la propriété de transformation de la vue tournée. XXX


1 commentaires

C'est de l'or! Cela vous donnera l'orientation d'une vue. J'ai utilisé cela avec uideviceorientationdidchangenotification pour détecter mon orientation précédente.