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

iOS 8.3 iPad上的自定义UIWindow可以在模拟器上工作,但不能在设备上工作,ios,objective-c,iphone,ipad,Ios,Objective C,Iphone,Ipad,我们有UIWindow代码,多年来一直在构建“拦截器”屏幕。我们最近注意到,在iOS 8.3 iPad上,当拦截器横向显示时,拦截器偏移256像素。没有什么奇怪之处: 1) 这不会发生在模拟器上,只会发生在设备上 2) 如果拦截器显示为纵向,则可以 3) 如果拦截器显示为纵向,然后旋转为横向,则可以 4) 间距为256像素,即宽度和高度之间的差值,即1024-768=256 我们最近更新到了Xcode 6,所以这可能也是一个因素 通过使用默认的Xcode Master Detail项目并对“in

我们有UIWindow代码,多年来一直在构建“拦截器”屏幕。我们最近注意到,在iOS 8.3 iPad上,当拦截器横向显示时,拦截器偏移256像素。没有什么奇怪之处:

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

2) 如果拦截器显示为纵向,则可以

3) 如果拦截器显示为纵向,然后旋转为横向,则可以

4) 间距为256像素,即宽度和高度之间的差值,即1024-768=256

我们最近更新到了Xcode 6,所以这可能也是一个因素

通过使用默认的Xcode Master Detail项目并对“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];


    }
如果在模拟器上运行此代码,并点击“+”按钮,则会得到:

这正是我们所期望的

然而,在我们的8.3 iPad设备上运行的同样的代码给了我们:

你知道为什么模拟器能工作而设备不能工作吗?建议?还有什么可以尝试的吗


[更新]我们只发现了一款有问题的设备,iPad 2。我们还发现,在UIWindow上设置rootViewController“解决”了这个问题。

您已将拦截器的帧显式设置为纵向尺寸。只有当设备旋转时,才会对其进行更改


相反,在创建拦截器时,请尝试获取从显示到当前窗口的大小。

以下是我们使用的修复方法:

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和更高版本)。下面是我们现在使用的代码:(当屏幕旋转时调用)


谢谢你的回复。我使用了多种选项,包括[[UIScreen mainScreen]边界]。设备上的256偏移量始终相同。事实上,我本来打算在示例中将其显式设置为300x100,但我认为使用全屏拦截器时问题会更加明显。我们也遇到了同样的问题,也仅在iPad2硬件上。模拟器工作正常。您介意在这里添加您的
rootViewController
解决方案作为“答案”吗?可能有代码示例和/或屏幕截图。谢谢如果我找到了解决办法,我也会回答。@pkamb-没问题。我已经添加了一段我们用来解决这个问题的代码。在iPad3和iOS8上也是如此。4@MikeM你是对的:有一个额外的转换正在进行。所以现在,
rootViewController
hack也适用于我。谢谢你的帮助。
    - (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;
    }