2014-09-25 3 views
17

У меня есть пустое приложение, в котором нет раскадровки или xib. Я хочу иметь скрытую строку состояния и поддерживать только ландшафтную ориентацию. Опять же, я не буду вносить эти изменения только в код и не касаюсь Info.plist.UIWindow с неправильным размером при использовании ландшафтной ориентации

Проблема

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

Broken UIWindow

Это мой делегат:

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

Это мой контроллер:

#import "AppViewController.h" 

@implementation AppViewController 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationLandscapeLeft; 
} 

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

@end 

То, что я пытался до сих пор

Если я установить RootViewController после вызов makeKeyAndVisible все, кажется, работает в первую очередь.

self.window.backgroundColor = [UIColor cyanColor]; 
[self.window makeKeyAndVisible]; 
self.window.rootViewController = [[AppViewController alloc] init]; 

Есть еще некоторые проблемы. Прежде всего мне это не нравится, поскольку он кажется очень хрупким. Вторая проблема заключается в том, что в более сложных приложениях, который устанавливает GLKViewController как RootViewController я получаю следующий результат (ожидается, не будет черная область слева):

Broken GLKViewController

Это выглядит как строка состояния не спрятаны достаточно рано. Несколько жест распознаватели активны и в GLKViewController и нажав на черную область дает следующее сообщение журнала:

2014-09-25 13: 20: 42,170 StackOverflowExample [6971: 107907] неожиданное окно ноль в _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; frame = (0 0; 375 667); userInteractionEnabled = NO; gestureRecognizers = NSArray: 0x7fa20b80a620; Слой = UIWindowLayer: 0x7fa20b806890

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

Все повернуто правильно, если я не переопределяю поддерживаемые методыInterfaceOrientations в контроллере просмотра. Но это, конечно, не то, что я хочу.

ответ

24

При запуске пейзаж приложения из портрета режим UIScreen имеет портрет оценки в IOS 8 (только если у вас нет этого приложение в приложении панели переключателей, так как IOS 8 делает некоторый кэш). Даже отображение окна с makeKeyAndVisible не изменяет его. Но он меняет [UIScreen mainScreen].bounds в соответствии с AppViewController доступной ориентации.

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Portrait bounds at this point 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

Так давайте менять рамку окна после того, как [self.window makeKeyAndVisible]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [UIWindow new]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 

    // Here it is 
    self.window.frame = [UIScreen mainScreen].bounds; 
    return YES; 
} 

Я думаю, что это IOS 8 ошибка.

+1

Спасибо за обмен. Я просто потратил много часов, пытаясь понять, как это сделать. –

+0

С помощью iOS8.1 и с помощью Swift мне нужно было добавить небольшую долю к ширине и высоте UIWindow, чтобы решить мою проблему, как это делается здесь: http://stackoverflow.com/a/26452679/190599 – CodeReaper

+0

Отлично работает, благодаря много. –

0

Проблема решается при добавлении запуска экрана, который вы можете сделать только путем добавления дополнительного имущества в info.plist

имел эту проблему сам, я не уверен, если вы можете добавить его с помощью кода хотя, я только сумел заставить его работать с info.plist + Запуск XIb экрана файл

<key>UILaunchStoryboardName</key> 
<string>Launch Screen</string> 

на самом деле я не думаю, что вы должны добавить файл XIb, если только ключ (с любым значением) доступен в plist он должен работать.

+0

Не сделал это для меня, к сожалению. –

8

У меня была аналогичная проблема, только для портрета.

Я исправил проблему, установив ориентацию строки состояния ДО экземпляр UIWindow

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Init my stuff 
    // ... 

    // Prepare window 
    [application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; // prevent start orientation bug 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

В вашем случае, вы должны использовать UIInterfaceOrienationLandscapeLeft (или справа) в методе setStatusBarOrientation:animated:.

Надеюсь, это поможет вам.

+0

гениальный! Ни один из других решений не работал – RawMean

0

Ни одно из решений, размещенных здесь или в другом месте, не работало для меня.

Тем не менее, я обнаружил, что эта проблема, по-видимому, не встречается со Storiesboard, поэтому альтернативным решением является переход от xib. (Этот факт, к сожалению, также маловероятен, что Apple серьезно относится к этой проблеме.)