[UIDevice currentDevice] .orientation == UIDeviceOrientationUnknown после нажатия UINavigationController - PullRequest
7 голосов
/ 13 декабря 2011

Это наблюдение больше всего на свете, потому что я, кажется, нашел обходной путь ...

Приведенный ниже код не работает , когда он находится в контроллере, который был помещен в стек UINavigationController . В этой ситуации [UIDevice currentDevice].orientation последовательно возвращает UIDeviceOrientationUnknown.

-(void)layoutAccordingToOrientation {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    NSLog(@"layoutAccordingToOrientation/orientation==%i", orientation);
    if (UIInterfaceOrientationIsLandscape(orientation)) {
        :
        _detailToolbar.frame = CGRectMake(0, 660, 1024, 44);
    } else {
        :
        _detailToolbar.frame = CGRectMake(0, 916, 768, 44);
    }
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self layoutAccordingToOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Выполнен следующий вызов :

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

Чтобы обойти эту проблему UIDeviceOrientationUnknown, я теперь использую следующее:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsLandscape(orientation)) {
    etc.
} else {
    etc.
}

... который работает каждый раз.

Тем не менее, я не понимаю, почему первый вариант не будет работать в контексте контроллера push-представления. Идеи кого-нибудь? Это просто ошибка?

1 Ответ

3 голосов
/ 17 августа 2012

Я мог бы вспомнить пару вещей здесь, но я не уверен, что они именно то, что вы ищете ...

Во-первых, когда приложение запускается, обычно ориентация устройства возвращаетсяUIDeviceOrientationUnknown по соображениям производительности.Одна вещь, которую вы можете попробовать, - это расположить ваши подпредставления внутри .nib или в раскадровке, с правильными параметрами автоизменения размера, и позвольте iOS сделать свое дело.

Во-вторых, если вы похожи на меня, возможно, вы тестируете устройство, которое находится рядом с вашим компьютером, лежа на столе.Ну, в этом случае вы не собираетесь получить вещь UIDeviceOrientationUnknown.Вы должны на самом деле проверить на UIDeviceOrientationIsValidInterfaceOrientation([[UIDevice currentDevice] orientation]).Например, если устройство ложится на спину, оно возвращает «да» этому утверждению.Это также означает, что когда вы используете UIInterfaceOrientationIsLandscape(orientation), вы получаете правильный результат по неправильной причине.UIInterfaceOrientationIsLandscape возвращает false не потому, что ориентация устройства UIDeviceOrientationPortrait, а потому, что оно недопустимо.

Не совсем уверен, помогло ли это, но мне потребовалось некоторое время, чтобы понять это, и я подумал, что это будетбудь любезен поделиться этой информацией!:)

...