iOS 8.3上的自定义UIWindow iPad可以在模拟器上运行,但不能运行在设备上

问题描述:

我们已经使用了多年的UIWindow代码来建立一个“拦截器”屏幕。我们最近注意到,在iOS 8.3 iPad上,当阻挡器以横向显示时,阻挡器会偏移256个像素。很少有古怪:iOS 8.3上的自定义UIWindow iPad可以在模拟器上运行,但不能运行在设备上

1)这不会在模拟器上,只有设备

2)假若干扰显示在人像这是很好发生

3)如果阻断剂以显示肖像,然后旋转到风景它很好。

4)的间隙是256个像素,这是宽度和高度,即之间的差,1024 - 768 = 256

我们最近更新到的Xcode 6,所以这可能是一个因素还有...

这个问题可以通过使用默认的Xcode主详细项目,以及向“insertNewObject”方法中的一些小的改动很容易被复制如下所示:

UIWindow *blocker; 

    - (void)insertNewObject:(id)sender { 


      blocker = [[UIWindow alloc] init]; 
      [blocker setBackgroundColor:[UIColor colorWithRed:.0 green:.0 blue:.0 alpha:.8]]; 
      [blocker makeKeyAndVisible]; 

      CGRect r = CGRectMake(0, 0, 768, 1024); 
      [blocker setFrame:r]; 


    } 

如果你运行这个代码在模拟器上,然后点击你所得到的“+”按钮:

enter image description here

这就是我们所期望的。

然而,这完全相同的代码,我们8.3的iPad设备上运行给我们:

enter image description here

为什么模拟器工程和设备没有任何想法?建议?其他事情要尝试?

[更新]我们只发现一个设备这哪里是一个问题,一个iPad 2,我们还发现,设置在一个UIWindow的RootViewController的“解决”问题。

+0

我们遇到同样的问题,也只在iPad 2硬件上。模拟器正常工作。 https://github.com/apptentive/apptentive-ios/issues/148 – pkamb

+0

你介意在这里添加你的'rootViewController'解决方案作为“答案”吗?也许有代码示例和/或截图。谢谢!如果我找到解决方案,我也会回答。 – pkamb

+1

@pkamb - 没问题。我已经添加了我们用来解决问题的代码片段。 –

您明确将阻挡者的框架设置为纵向尺寸。只有在设备旋转时才会更改。

取而代之,尝试在创建阻塞程序时从显示屏获取当前窗口的大小。

+1

感谢您的回复。我已经使用了[[UIScreen mainScreen]边界]的选项组合。设备上的256偏移总是相同的。我实际上是要明确地将其设置为300x100的样本,但通过全屏拦截器计算问题会更明显。 –

这里是我们使用的修补程序:

blocker = [[UIWindow alloc] init]; 
[blocker setBackgroundColor:[UIColor colorWithRed:.0 green:.0 blue:.0 alpha:.8]]; 

UIViewController *blockerRoot = [UIViewController new]; 
blocker.rootViewController = blockerRoot; 
CGRect r = [[UIScreen mainScreen] bounds]; 
[blocker setFrame:r]; 

[blocker makeKeyAndVisible]; 

我们也能够因为去除旋转调节代码现在视图控制器管理得当对我们(至少为iOS 8及更高版本)。下面是我们现在使用的代码:(当屏幕旋转时调用)

- (void)adjustForRotation 
    { 

     if ([UIUtil iOS8OrLater]){ 
     // iOS 8 handles this correctly, no need for adjustments... 
      return; 
     } 

     UIInterfaceOrientation io = [[UIApplication sharedApplication] statusBarOrientation]; 
     if (UIInterfaceOrientationIsLandscape(io)){ 
      CGRect r = [[UIScreen mainScreen] bounds]; 
      CGFloat x = r.size.height/2.0; 
      CGFloat y = r.size.width/2.0; 
      self.center = CGPointMake(x, y);  
     } 
     return; 
    }