Как определить ориентацию устройства на iOS? - PullRequest
71 голосов
/ 06 апреля 2011

У меня есть вопрос о том, как определить ориентацию устройства на iOS.Мне не нужно получать уведомления об изменениях, только сама текущая ориентация.Кажется, это довольно простой вопрос, но я не смог обернуть голову вокруг него.Вот что я сделал до сих пор:

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

На мой взгляд, это должно сработать.Я включаю устройство для получения уведомлений об ориентации устройства, затем спрашиваю, в какой ориентации оно находится, но затем оно не работает, и я не знаю, почему.

Ответы [ 11 ]

118 голосов
/ 25 марта 2012

Действительно старая тема, но не реальное решение.

У меня была та же проблема, но я обнаружил, что получение 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
77 голосов
/ 12 декабря 2012

если 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"); }
22 голосов
/ 08 января 2015

Если вы хотите получить ориентацию устройства непосредственно из акселерометра, используйте [[UIDevice currentDevice] orientation].Но если вам нужна текущая ориентация вашего приложения ( ориентация интерфейса ), используйте [[UIApplication sharedApplication] statusBarOrientation].

22 голосов
/ 30 октября 2014

Для того, что вы ищете в первую очередь, вы должны получить уведомление, если ориентация изменилась! Вы можете установить это в viewDidLoad как

[[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)
    {
    }
}
9 голосов
/ 06 апреля 2011

UIViewController имеет свойство interfaceOrientation, к которому вы можете обратиться, чтобы узнать текущую ориентацию контроллера представления.

Что касается вашего примера, это должно работать.Когда вы говорите, что это не работает, что вы имеете в виду?Какие результаты это дает вам по сравнению с тем, что вы ожидали?

7 голосов
/ 22 декабря 2016

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
4 голосов
/ 12 июля 2013

Не был удовлетворен "UIDeviceOrientation" , потому что, когда ориентация контроллера UIView установлена ​​на определенную ориентацию, вы не получаете соответствующую информацию с ориентацией устройства, поэтому правильное решение - использовать "UIInterfaceOrientation" .

Вы можете получить ориентацию из UIViewController с помощью "self.interfaceOrientation" , но когда вы анализируете наш код, вам может потребоваться выполнить этот вид теста вне контроллера представления (пользовательское представление , категория…), поэтому вы по-прежнему можете получить доступ к информации из любого места за пределами контроллера с помощью rootviewController :

if (UIInterfaceOrientationIsLandscape(view.window.rootViewController.interfaceOrientation)) {
}
2 голосов
/ 24 августа 2015

Существует способ достичь этого независимо от того, включена блокировка ориентации или нет с использованием данных из 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");
                                }

                            }

}];
1 голос
/ 20 января 2016

Вот некоторые переменные 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 голос
/ 06 апреля 2011

Вы разблокировали аппаратную блокировку для ориентации устройства?Есть один на краю моего iPad 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...