iPad UISplitViewController Ориентация запуска - Root View отображается в портретной - PullRequest
0 голосов
/ 26 июня 2010

Итак, у меня есть UISplitViewController, который является корневым представлением моей программы.Я установил начальную ориентацию как LandscapeLeft, и в моем списке поддерживаются все 4 ориентации.

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

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

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

if (UIDeviceOrientationIsValidInterfaceOrientation([UIDevice currentDevice].orientation)) {
    if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
        [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
    else
        [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

Так что это по сути заставляет его рисовать правильно, что прекрасно работает, за исключением случаев, когда приложение запускается с лежащим на нем устройством.Тогда я не знаю портрет против пейзажа (и я не знаю, как его найти).Поэтому я, в сущности, тогда не могу точно сказать, что делать.

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

Есть идеи?

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Спасибо за ваш код для исправления этого для портрета и пейзажа. Я нашел быстрое решение этой проблемы, когда его квартира на столе или вверх ногами (не уверен, кто запустит приложение вверх ногами, но такая же проблема возникает в этом случае):

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 в этот момент не используется. Просто подумал, что дам вам знать, если это поможет.

0 голосов
/ 13 октября 2010

Необходимо убедиться, что вы добавили представление UISplitViewController в UIWindow ВНУТРИ метода application:application didFinishLaunchingWithOptions: вашего делегата приложения (не позднее), иначе изначально разделенное представление не будет правильно вращаться.

0 голосов
/ 06 июля 2010

Ваш RootViewController отображается вместо вашего detailViewCOntroller?кажется, вы делаете что-то плохое ... (может быть, инвертированный порядок viewControllers в SplitViewController.viewControllers?)

...