UIDevice Ориентация - PullRequest
       11

UIDevice Ориентация

12 голосов
/ 30 мая 2009

У меня есть следующий код в методе. Когда я запускаю это в симуляторе, отладчик пропускает прямо код. Чего мне не хватает?

if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || 
        ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)) 
{       

} else {

}

Ответы [ 8 ]

54 голосов
/ 14 июня 2011

Лучший способ определить ориентацию интерфейса - взглянуть на ориентацию строки состояния:

 UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

    if(orientation == UIInterfaceOrientationPortrait || 
       orientation == UIInterfaceOrientationPortraitUpsideDown) {

       //Portrait orientation

}

if(orientation == UIInterfaceOrientationLandscapeRight ||
   orientation == UIInterfaceOrientationLandscapeLeft) {

    //Landscape orientation

}

UIDevice класс измеряет ориентацию на основе акселерометра, и если устройство лежит ровно, оно не вернет правильную ориентацию.

23 голосов
/ 01 декабря 2009

Обратите внимание, что есть макросы UIDeviceOrientationIsLandscape и UIDeviceOrientationIsPortrait, поэтому вместо того, чтобы сравнивать их отдельно с LandscapeLeft и LandscapeRight, вы можете просто сделать это так:

if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
}
18 голосов
/ 30 мая 2009

Обновление 2

Это не должно иметь значения, но попробуйте включить уведомления об ориентации:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];


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

Обновление

Мой плохой, я предполагал, что это было пусто.

Попробуйте удалить оператор or и просто проверить единственную ориентацию. Посмотри, исправит ли это. Может быть, есть проблема с скобками или что-то глупое.

У меня есть следующий тест, работающий в рабочем коде, поэтому ваша техника должна работать:

    if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || 
        ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)) {


}

Оригинальный ответ

Вы должны фактически поместить операторы в блоки if, чтобы получить его.

Отладчик достаточно умен, чтобы пропускать пустые блоки.

2 голосов
/ 22 сентября 2011

Другим способом сделать это без включения уведомления об ориентации будет

Шаг 1: Сохранить текущую ориентацию в локальной переменной myCurrentOrientation и назначить ее следующим образом:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
    myCurrentOrientation = toInterfaceOrientation;
}

Шаг 2: Используйте myCurrentOrientation для чека

if (UIInterfaceOrientationIsLandscape(myCurrentOrientation) == YES) {
    // landscape
}
else {
    // portrait.
}
0 голосов
/ 22 мая 2014

Вот метод, чтобы найти ориентацию и истинный центр экрана. Я использовал метод Туши, чтобы правильно установить UIActivityIndicatorView.

- (BOOL) isPortraitOrientation {
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if(orientation == UIInterfaceOrientationPortrait ||
       orientation == UIInterfaceOrientationPortraitUpsideDown) {
        return true;
    }
    if(orientation == UIInterfaceOrientationLandscapeRight ||
       orientation == UIInterfaceOrientationLandscapeLeft) {
        return false;
    }
    return false;
}

И способ получить центр ...

- (void) findMyUIViewCenter {
    CGPoint myCenter;
    if ([self isPortraitOrientation]) {
        myCenter = self.view.center;
    }
    else {
        myCenter = CGPointMake(self.view.frame.size.height / 2.0, self.view.frame.size.width / 2.0);
    }
    NSLog(@"true center -- x:%f y:%f )",myCenter.x,myCenter.y);
}
0 голосов
/ 29 августа 2013

Я рекомендую вам использовать мой выделенный код вместо вашего, чтобы сохранить какой-то код строк.

-(void) viewDidLoad
{
    [super viewDidLoad];
    [self rotations];
}

-(void)rotations
{
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                         name:UIDeviceOrientationDidChangeNotification
                                         object:nil];
}

-(void) orientationChanged:(NSNotification *)notification
{
    //USE THIS PART
    //USE THIS PART
    //USE THIS PART
    //USE THIS PART
    //USE THIS PART
    if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
    {
    }
}

ВМЕСТО

if([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait || 
   [[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortraitUpsideDown) 
{
}
0 голосов
/ 03 февраля 2012

Скажем, вы находитесь в твике Springboard и хотите что-то показать в зависимости от ориентации текущего приложения, тогда вы можете использовать это (только для джейлбрейка):

UIInterfaceOrientation o = [[UIApplication sharedApplication] _frontMostAppOrientation];
0 голосов
/ 05 июля 2011

Хех, вам нужно позвонить [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] до получения значения. Посмотрите документацию по этому методу. Мне понадобилось время, чтобы отследить это.

...