web-dev-qa-db-ja.com

iOSでデバイスの向きを検出するにはどうすればよいですか?

IOSでデバイスの向きを検出する方法について質問があります。変更通知を受け取る必要はなく、現在の向きだけを受け取る必要があります。これはかなり簡単な質問のように思えますが、私は頭を悩ませることができませんでした。以下は私がこれまでにしたことです:

UIDevice *myDevice = [UIDevice currentDevice] ;
[myDevice beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = myDevice.orientation;
BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation);
[myDevice endGeneratingDeviceOrientationNotifications];

私の考えでは、これは機能するはずです。デバイスがデバイスの向きの通知を受信できるようにし、デバイスの向きを確認しますが、機能していないため、理由がわかりません。

71
JusmanX

本当に古いスレッドですが、実際の解決策はありません。

私は同じ問題を抱えていましたが、UIDeviceOrientationの取得が常に一貫しているわけではないことがわかったので、代わりにこれを使用します:

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

uIViewControllerの場合:

if (UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
    // 
}

uIViewの場合:

if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
{
    //
}

UIDevice.h:

#define UIDeviceOrientationIsPortrait(orientation)  ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown)
#define UIDeviceOrientationIsLandscape(orientation) ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight)

更新

このコードをxxx-Prefix.pchに追加すると、どこでも使用できます。

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

使用法:

if (isLandscape) { NSLog(@"Landscape"); }
77
TONy.W

あなたが最初に探しているものについては、向きが変わった場合に通知を受け取る必要があります!次のようにviewDidLoadでThis Thingを設定できます

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

そして、あなたのデバイスの向きが変更されたときはいつでもOrientationDidChange

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

    if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight)
    {
    }
    else if(Orientation==UIDeviceOrientationPortrait)
    {
    }
}
22

デバイスの向きを加速度計から直接取得する場合は、[[UIDevice currentDevice] orientation]。ただし、アプリケーションの現在の向きが必要な場合(インターフェイスの向き[[UIApplication sharedApplication] statusBarOrientation]

22
rafalkitta

UIViewControllerには、View Controllerの現在の向きを見つけるためにアクセスできるinterfaceOrientationプロパティがあります。

あなたの例に関しては、それはうまくいくはずです。それが機能していないと言うとき、どういう意味ですか?期待した結果に対してどのような結果が得られますか?

9
Jasarien

In Swift 3.0

デバイスの向きを取得するために

/* return current device orientation.
   This will return UIDeviceOrientationUnknown unless device orientation notifications are being generated. 
*/
UIDevice.current.orientation

アプリからデバイスの向きを取得するため

UIApplication.shared.statusBarOrientation
8
Ashok R

"UIDeviceOrientation"に満足しなかったのは、UIViewcontrollerの向きが特定の向きに固定されている場合、デバイスの向きに関する適切な情報を取得できないためです。そのため、正しいことは "UIInterfaceOrientation"を使用することです。

"self.interfaceOrientation"を使用してUIViewControllerから方向を取得できますが、コードを因数分解するときは、このようなことをする必要があるかもしれませんView Controller(カスタムビュー、カテゴリ…)の外部でテストするため、rootviewControllerを使用して、コントローラの外部のどこからでも情報にアクセスできます。

if (UIInterfaceOrientationIsLandscape(view.window.rootViewController.interfaceOrientation)) {
}
4
Nicolas Lauquin

CoreMotionからのデータを使用して、方向ロックが有効かどうかにかかわらず、これを実現する方法があります。これはコードです:

#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

以下に、検出を容易にするためのSwift変数を示します。

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

デバイスの向きのハードウェアロックを解除しましたか? iPad 1のエッジに1つあります。

1
Martin Lütke

これを行う私の現在の方法:

+ (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);
    }
}

何らかの理由で、rootViewControllerがまだstatusBarOrientationに対して安全に失敗していない場合...

0
Renetik