J'ai une question sur la façon de détecter l'orientation du périphérique sur iOS. Je n'ai pas besoin de recevoir les notifications de modification, mais seulement l'orientation actuelle. Cela semble être une question assez simple, mais je n’ai pas réussi à comprendre. Voici ce que j'ai fait jusqu'à présent:
UIDevice *myDevice = [UIDevice currentDevice] ;
[myDevice beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = myDevice.orientation;
BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation);
[myDevice endGeneratingDeviceOrientationNotifications];
Dans mon esprit, cela devrait fonctionner. J'autorise l'appareil à recevoir les avis d'orientation, puis je lui demande dans quelle orientation il se trouve, mais cela ne fonctionne pas et je ne sais pas pourquoi.
Vraiment vieux fil, mais pas de vraie solution.
J'ai eu le même problème, mais j'ai découvert qu'obtenir The UIDeviceOrientation n'était pas toujours cohérent, utilisez plutôt ceci:
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if(orientation == 0) //Default orientation
//UI is in Default (Portrait) -- this is really a just a failsafe.
else if(orientation == UIInterfaceOrientationPortrait)
//Do something if the orientation is in Portrait
else if(orientation == UIInterfaceOrientationLandscapeLeft)
// Do something if Left
else if(orientation == UIInterfaceOrientationLandscapeRight)
//Do something if right
si UIViewController:
if (UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
//
}
si UIView:
if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
{
//
}
UIDevice.h:
#define UIDeviceOrientationIsPortrait(orientation) ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown)
#define UIDeviceOrientationIsLandscape(orientation) ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight)
Mise à jour:
ajoutez ce code à xxx-Prefix.pch pour pouvoir l’utiliser n’importe où:
// check device orientation
#define dDeviceOrientation [[UIDevice currentDevice] orientation]
#define isPortrait UIDeviceOrientationIsPortrait(dDeviceOrientation)
#define isLandscape UIDeviceOrientationIsLandscape(dDeviceOrientation)
#define isFaceUp dDeviceOrientation == UIDeviceOrientationFaceUp ? YES : NO
#define isFaceDown dDeviceOrientation == UIDeviceOrientationFaceDown ? YES : NO
usage:
if (isLandscape) { NSLog(@"Landscape"); }
Pour ce que vous cherchez en premier, vous devez obtenir une notification si l'orientation a changé! Vous pouvez définir cette chose dans viewDidLoad comme
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(OrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
et chaque fois que l'orientation de votre appareil change (OrientationDidChange Appelé où vous pouvez faire ce que vous voulez en fonction de l'orientation
-(void)OrientationDidChange:(NSNotification*)notification
{
UIDeviceOrientation Orientation=[[UIDevice currentDevice]orientation];
if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight)
{
}
else if(Orientation==UIDeviceOrientationPortrait)
{
}
}
Si vous voulez obtenir orientation de l'appareil directement à partir de l'accéléromètre, utilisez [[UIDevice currentDevice] orientation]
. Mais si vous avez besoin de l'orientation actuelle de votre application (orientation de l'interface), utilisez [[UIApplication sharedApplication] statusBarOrientation]
.
UIViewController
possède une propriété interfaceOrientation
à laquelle vous pouvez accéder pour connaître l'orientation actuelle d'un contrôleur de vue.
En ce qui concerne votre exemple, cela devrait fonctionner. Que voulez-vous dire lorsque vous dites que cela ne fonctionne pas? Quels sont les résultats obtenus par rapport à ce que vous espériez?
Dans Swift 3.0
pour obtenir l'orientation du périphérique.
/* return current device orientation.
This will return UIDeviceOrientationUnknown unless device orientation notifications are being generated.
*/
UIDevice.current.orientation
pour obtenir l'orientation de l'appareil depuis votre application
UIApplication.shared.statusBarOrientation
N'était pas satisfait par "UIDeviceOrientation" car, lorsqu'une orientation UIViewcontroller est fixée sur une orientation spécifique, vous n'obtenez pas d'informations pertinentes avec l'orientation du périphérique. La bonne chose à faire est d'utiliser "UIInterfaceOrientation".
Vous pouvez obtenir l'orientation de UIViewController avec un "self.interfaceOrientation", mais lorsque vous factorisez notre code, vous devrez peut-être effectuer ce type de test en dehors d'un contrôleur de vue (vue personnalisée, catégorie…), afin que vous puissiez toujours accéder aux informations n'importe où en dehors du contrôleur en utilisant le rootviewController:
if (UIInterfaceOrientationIsLandscape(view.window.rootViewController.interfaceOrientation)) {
}
Il existe un moyen d'y parvenir, que le verrouillage de l'orientation activé ou non en utilisant les données de CoreMotion. C'est le code:
#import <CoreMotion/CoreMotion.h>
CMMotionManager *cm=[[CMMotionManager alloc] init];
cm.deviceMotionUpdateInterval=0.2f;
[cm startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *data, NSError *error) {
if(fabs(data.gravity.x)>fabs(data.gravity.y)){
NSLog(@"LANSCAPE");
if(data.gravity.x>=0){
NSLog(@"LEFT");
}
else{
NSLog(@"RIGHT");
}
}
else{
NSLog(@"PORTRAIT");
if(data.gravity.y>=0){
NSLog(@"DOWN");
}
else{
NSLog(@"UP");
}
}
}];
Voici quelques variables Swift pour faciliter la détection:
let LANDSCAPE_RIGHT: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight
let LANDSCAPE_LEFT: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft
let LANDSCAPE: Bool = LANDSCAPE_LEFT || LANDSCAPE_RIGHT
let PORTRAIT_NORMAL: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait
let PORTRAIT_REVERSE: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.PortraitUpsideDown
let PORTRAIT: Bool = PORTRAIT_REVERSE || PORTRAIT_NORMAL
Avez-vous déverrouillé le verrou matériel pour l'orientation de l'appareil? Il y en a un au bord de mon iPad 1.
Ma façon actuelle de faire ceci:
+ (BOOL)isPortrait {
let window = UIApplication.sharedApplication.delegate.window;
if(window.rootViewController) {
let orientation =
window.rootViewController.interfaceOrientation;
return UIInterfaceOrientationIsPortrait(orientation);
} else {
let orientation =
UIApplication.sharedApplication.statusBarOrientation;
return UIInterfaceOrientationIsPortrait(orientation);
}
}
Si pour une raison quelconque, rootViewController n’est pas encore connecté à statusBarOrientation ...