web-dev-qa-db-fra.com

Comment détecter l'orientation du périphérique sur iOS?

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.

71
JusmanX

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
118
Moe

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"); }
77
TONy.W

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)
    {
    }
}
22
Saurabh Prajapati

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].

22
rafalkitta

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?

9
Jasarien

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
8
Ashok R

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)) {
}
4
Nicolas Lauquin

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");
                                }

                            }

}];
2
FlySoFast

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
1
Beninho85

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.

1
Martin Lütke

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 ...

0
Renetik