Спасибо за ваш код для исправления этого для портрета и пейзажа. Я нашел быстрое решение этой проблемы, когда его квартира на столе или вверх ногами (не уверен, кто запустит приложение вверх ногами, но такая же проблема возникает в этом случае):
if (UIDeviceOrientationIsValidInterfaceOrientation([UIDevice currentDevice].orientation)) {
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
else if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}
else {
if (([UIApplication sharedApplication].statusBarOrientation == 1) || ([UIApplication sharedApplication].statusBarOrientation == 0))
{
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}
else {
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
}
NSLog(@"orientation: %d", [UIApplication sharedApplication].statusBarOrientation);
}
В моем приложении это работает, потому что я просто хотел заставить их работать в портретном режиме, и если после этого они переместились в ландшафт, он вращается и работает нормально, потому что я поддерживаю все ориентации.
Не думаю, что это будет работать во всех случаях, но это может помочь вам встать на правильный путь. Вам просто нужно поиграть со значением statusBarOrientation и вручную установить его, исходя из того, что, по вашему мнению, работает, если InterfaceOrientation недопустимо (что не так, если устройство лежит на столе или перевернуто).
Надеюсь, это поможет ...
Редактировать: Кроме того, мне нужно, чтобы мое приложение знало ориентацию, когда они выбирают новые элементы в SplitViewController, так что было непросто, когда устройство было плоским или вверх ногами. И способ, которым я обнаружил, был ли он плоским или перевернутым, состоял в том, чтобы сначала видеть, была ли ориентация правильной, как вы:
if (UIDeviceOrientationIsValidInterfaceOrientation([UIDevice currentDevice].orientation))
Но тогда, если это не так, я проверяю, имеет ли self.popoverController значение nil. Если это не так, то это в портретном, а если это так, то в его ландшафте (в зависимости от того, как работает splitViewController, установив для него ноль или нет):
if (self.popoverController)
{
NSLog(@"in portrait");
}
else {
NSLog(@"in landscape");
}
Это не сработает в делегате приложения во время запуска приложения, потому что этот detailViewController в этот момент не используется. Просто подумал, что дам вам знать, если это поможет.