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

时间:2015-05-14 12:48:33

标签: ios objective-c iphone ipad

我们有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];


    }

如果您在模拟器上运行此代码,请点按" +"你得到的按钮:

enter image description here

这是我们所期望的。

然而,在我们的8.3 iPad设备上运行的同样精确的代码为我们提供了:

enter image description here

有关模拟器工作原理和设备无效的任何想法?建议?其他要尝试的事情?

[更新] 我们发现只有一台设备存在问题,iPad 2.我们还发现在UIWindow上设置rootViewController"解决"问题。

2 个答案:

答案 0 :(得分:1)

以下是我们使用的解决方法:

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;
    }

答案 1 :(得分:0)

您将显式设置阻挡程序的框架为纵向尺寸。只有在设备旋转时才会更改。

相反,尝试在创建阻止程序时将显示大小设置为当前窗口。