2015-07-21 18 views
5

Mam aplikację na iPada, na której utworzę nowy UIWindow na początku aplikacji i wyświetlam ją, wykonując synchronizację zasobów. Gdy aplikacja jest uruchamiana, gdy iPad znajduje się w orientacji pionowej, wszystko jest w porządku. Jednak w orientacji poziomej, nowo utworzony rozmiar UIWindow's wydaje się być w porządku, ale wygląda na bok, a jego współrzędne wydają się dziwne. Oto screeny zarówno dla orientacji pionowej i poziomej:Nowo utworzony interfejs UIWindow jest otwarty na bok po otwarciu aplikacji w krajobrazie

enter image description here

enter image description here

Krajobraz jeden uzyskuje się poprzez obracanie w prawo raz.

Kawałek kodu, w którym tworzę i pokazać UIWindow jest następujący:

UIWindow *window=[UIApplication sharedApplication].keyWindow; 
self.progressWindow = [[UIWindow alloc] initWithFrame:window.frame]; 
self.progressWindow.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f]; 
self.progressWindow.windowLevel = UIWindowLevelAlert; 

/* some other code to create the subviews */ 

[self.progressWindow makeKeyAndVisible]; 

Ten problem występuje tylko na iOS 8.

Odpowiedz

1

O ile zrozumiałem, nowo utworzony UIWindow na nie obracają się automatycznie podczas zmiany orientacji. Nie wiem, czy to jest nowy iOS 8 lub jeśli jest to błąd, ale udało mi się przezwyciężyć problem z poniższego fragmentu kodu:

UIWindow *window=[UIApplication sharedApplication].keyWindow; 
self.progressWindow = [[UIWindow alloc] initWithFrame:window.frame]; 
self.progressWindow.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f]; 
self.progressWindow.windowLevel = UIWindowLevelAlert; 

/* some other code to create the subviews */ 

[self handleOrientationChange]; 
[self.progressWindow makeKeyAndVisible]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOrientationChange) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; 

Realizacja dla handleOrientationChange się następująco:

#define DegreesToRadians(degrees) (degrees * M_PI/180) 

- (void)handleOrientationChange 
{ 
    if (self.progressWindow) 
    { 
     // rotate the UIWindow manually 
     UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
     [self.progressWindow setTransform:[self transformForOrientation:orientation]]; 

     // resize the UIWindow according to the new screen size 
     if ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]) 
     { 
      // iOS 8 
      CGRect screenRect = [UIScreen mainScreen].nativeBounds; 
      CGRect progressWindowFrame = self.progressWindow.frame; 
      progressWindowFrame.origin.x = 0; 
      progressWindowFrame.origin.y = 0; 
      progressWindowFrame.size.width = screenRect.size.width/[UIScreen mainScreen].nativeScale; 
      progressWindowFrame.size.height = screenRect.size.height/[UIScreen mainScreen].nativeScale; 
      self.progressWindow.frame = progressWindowFrame; 
     } 
     else 
     { 
      // iOs 7 or below 
      CGRect screenRect = [UIScreen mainScreen].bounds; 
      CGRect progressWindowFrame = self.progressWindow.frame; 
      progressWindowFrame.origin.x = 0; 
      progressWindowFrame.origin.y = 0; 
      progressWindowFrame.size.width = screenRect.size.width; 
      progressWindowFrame.size.height = screenRect.size.height; 
      self.progressWindow.frame = progressWindowFrame; 
     } 
    } 
} 

- (CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orientation { 

    switch (orientation) { 

     case UIInterfaceOrientationLandscapeLeft: 
      return CGAffineTransformMakeRotation(-DegreesToRadians(90)); 

     case UIInterfaceOrientationLandscapeRight: 
      return CGAffineTransformMakeRotation(DegreesToRadians(90)); 

     case UIInterfaceOrientationPortraitUpsideDown: 
      return CGAffineTransformMakeRotation(DegreesToRadians(180)); 

     case UIInterfaceOrientationPortrait: 
     default: 
      return CGAffineTransformMakeRotation(DegreesToRadians(0)); 
    } 
} 

Wpadłem na pomysł z zaakceptowanej odpowiedzi na pytanie this.

0

Wspólna aplikacja utrzymuje odniesienie do okna przez jego keystone właściwość okna:

let w = UIApplication.sharedApplication().keyWindow

To odwołanie, jednak, jest nieco zmienne, ponieważ system może utworzyć tymczasowe okna i wstawić je jako okno klucza aplikacji.

spróbować zamiast

[[UIApplication sharedApplication].delegate window] 
+0

Używam tylko keyWindow, aby uzyskać jego ramkę, więc nie sądzę, że to jest problem. – halileohalilei