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

Я разрабатываю приложение только для ландшафта на основе xib. Приложение запускается в альбомной ориентации корректно. Однако вид в моем основном ViewController представлен в портретной ориентации. То есть он поворачивается на 90 градусов, чтобы изображение выглядело обрезанным и не занимало весь экран. Если я использую свой интерфейс для представления модального контроллера представления, а затем возвращаюсь к основному ViewController, проблема устраняется сама собой (представление представлено в альбомной ориентации). Эта проблема не возникала в Xcode 4.2. Это произошло после обновления до Xcode 4.3, и единственные изменения кода, которые были сделаны, были автоматически реализованы Xcode при обновлении настроек проекта.

Основываясь на советах в других сообщениях, я проверил свои настройки Info.plist для поддерживаемых ориентаций интерфейса и исходной ориентации интерфейса. Я переопределил метод shouldAutorotateToInterfaceOrientation для каждого из моих контроллеров представления, чтобы он возвращал YES только для альбомной ориентации. Кроме того, я отключил автоматическое изменение размера для представления, так как я никогда не хочу, чтобы размер/ориентация представления изменялись.

Основываясь на идеях в этой ссылке [1], я подозревал, что проблема заключается в том, что представление не получает вызов для изменения ориентации при запуске, возможно, из-за удаления концепции MainWindow.xib, которая, по-видимому, заменена следующим Вставленный Xcode код в AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

Я изменил этот метод, чтобы сгенерировать универсальный корневой контроллер представления, из которого представлен мой класс ViewController, как показано в приведенном ниже коде:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController* myViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.viewController = [[UIViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    [self.viewController presentModalViewController:myViewController animated:NO];
    return YES;
}

Вуаля! Это решило мою проблему. Однако для меня это похоже на изменение на фундаментальном уровне, чего я не хочу делать на данном этапе своего развития. То, что я намеревался сделать своим корневым контроллером представления, теперь является модальным представлением. У кого-нибудь есть другое решение этой проблемы?

Заранее спасибо!


person jenonen    schedule 10.04.2012    source источник


Ответы (2)


У меня была такая же проблема: приложение, которое должно было быть в альбомной ориентации, предполагало, что ViewController всегда был в портретной ориентации. Я внес массу изменений в каждый аспект проекта и info.plist, в том числе дал основному UIWindow контроллер корневого представления, который был горизонтальным. Это все еще не сработало. В конце концов я отменил все изменения и просто добавил две строки, указанные ниже, к моему делегату приложения:

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{
    [_window addSubview:[_viewController view]];
    glView = _viewController.glView;

    // THIS FIXED ORIENTATION FOR ME IN IOS 6
    _window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    // END

    ...my other setup code here...
}

Больше ничего не было нужно.

Похоже, что по какой-то причине в iOS 6 параметр UIWindow root-view-controller иногда игнорируется в Interface Builder. Я уверен, что мои рассуждения где-то неверны, но я подумал, что это может помочь подтолкнуть кого-то к более полному и исчерпывающему ответу.

person Dene    schedule 09.10.2012

В iOS 8 также необходимо настроить рамку окна на UIScreen, так как она не будет автоматически обновляться.

self.window.frame = [UIScreen mainScreen].bounds;
person Gokul    schedule 12.01.2015