2014-09-25 15 views
17

Mam pustą aplikację i nie ma w niej scenorysów lub ksyw. Chcę mieć ukryty pasek stanu i wspierać tylko orientację poziomą. Ponownie, nie będę dokonywał tych zmian tylko w kodzie i nie dotykam Info.plist.UIWindow z niewłaściwym rozmiarem w orientacji poziomej

Problem

tworzę UIWindow z kontrolerem, który mówi tylko obsługiwana orientacja jest krajobraz. W takim przypadku moje UIWindow jest tworzone w wymiarze trybu portretowego i nie obraca się. Oczekiwanym rezultatem będzie ekran całkowicie niebieski.

Broken UIWindow

To mój pełnomocnik:

#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 

To jest mój kontroler:

#import "AppViewController.h" 

@implementation AppViewController 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationLandscapeLeft; 
} 

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

@end 

Co Próbowałem tak daleko

Jeżeli ustawić rootViewController po wywołanie funkcji makeKeyAndVisible na początku wszystko wydaje się działać.

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

Nadal występują pewne problemy. Przede wszystkim nie podoba mi się to, ponieważ wydaje się bardzo delikatna. Drugim problemem jest to, że w bardziej złożonych aplikacji, które ustawia GLKViewController jako rootViewController otrzymuję następujący wynik (oczekiwane byłoby czarny obszar po lewej):

Broken GLKViewController

wygląda jak pasek stanu nie jest wystarczająco wcześnie ukryte. Kilka Recognizers gest są aktywne, a w GLKViewController i kliknięcie na czarny obszar daje następujący komunikat protokołu:

2014-09-25 13: 20: 42,170 StackOverflowExample: 107907 [6971] nieoczekiwane okna zera w _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; frame = (0 0; 375 667); userInteractionEnabled = NIE; gestureRecognizers = NSArray: 0x7fa20b80a620; layer = UIWindowLayer: 0x7fa20b806890

Przeprowadziłem również różne inne zmiany, takie jak dołączenie pustego kontrolera UIViewCorminser i dodanie mojego widoku jako pod-widoku. W takim przypadku mój widok wygląda poprawnie, ale okno wciąż używa niewłaściwych wymiarów.

Wszystko obraca się poprawnie, jeśli nie zastępuję metod supportedInterfaceOrientations w moim kontrolerem widoku. Ale to oczywiście nie jest to, czego chcę.

Odpowiedz

24

Po uruchomieniu krajobraz aplikację z portret tryb UIScreen ma portret granic w iOS 8 (tylko jeśli nie masz tej aplikacji w APP panelu przełącznika, jak iOS 8 sprawia, że ​​niektóre cache). Nawet wyświetlanie okna z makeKeyAndVisible nie zmienia jego ramki. Ale zmienia się [UIScreen mainScreen].bounds według dostępnej orientacji.

#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 

Więc zmieńmy rama okienna po [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; 
} 

myślę, że to jest bug iOS 8.

+1

Dzięki za udostępnienie. Spędziłem wiele godzin próbując dowiedzieć się, jak to zrobić. –

+0

Dzięki iOS8.1 i użyciu Swiftu potrzebowałem dodać niewielki ułamek do szerokości i wysokości UIWindow, aby rozwiązać mój problem, tak jak tutaj: http://stackoverflow.com/a/26452679/190599 – CodeReaper

+0

Działa świetnie, dzięki los. –

0

Problem został rozwiązany podczas dodawania ekran Launch, które można zrobić tylko poprzez dodanie obiekt do Info.plist

miał ten problem samodzielnie, nie jestem pewien, czy można go dodać za pomocą kodu chociaż, ja tylko udało się zrobić to praca z Info.plist + Wprowadzenie XIb Ekran pliku

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

Właściwie nie sądzę, trzeba dodać plik XIb, jeśli tylko klawisz (z dowolną wartość) jest dostępny w plist powinien działać.

+0

Nie zrobiłem tego dla mnie niestety. –

8

Miałem podobny problem z aplikacją tylko dla portretów.

Naprawiłem problem przez ustawienie stanu orientację barze przed instancję 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; 
} 

W twoim przypadku, należy użyć UIInterfaceOrienationLandscapeLeft (lub prawo) w metodzie setStatusBarOrientation:animated:.

Mam nadzieję, że to pomoże.

+0

genialny! Żadne z pozostałych rozwiązań nie zadziałało – RawMean

0

Żadne z przedstawionych tu rozwiązań ani w żadnym innym miejscu nie działało dla mnie.

Jednak odkryłem, że problem ten nie występuje w przypadku scenorysów, więc alternatywnym rozwiązaniem jest odejście od Xibs. (Fakt ten niestety także sprawia, że ​​jest mało prawdopodobne, że Apple podejmie poważnie problem.)

Powiązane problemy