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];
}
如果你运行这个代码在模拟器上,然后点击你所得到的“+”按钮:
这就是我们所期望的。
然而,这完全相同的代码,我们8.3的iPad设备上运行给我们:
为什么模拟器工程和设备没有任何想法?建议?其他事情要尝试?
[更新]我们只发现一个设备这哪里是一个问题,一个iPad 2,我们还发现,设置在一个UIWindow的RootViewController的“解决”问题。
您明确将阻挡者的框架设置为纵向尺寸。只有在设备旋转时才会更改。
取而代之,尝试在创建阻塞程序时从显示屏获取当前窗口的大小。
感谢您的回复。我已经使用了[[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;
}
我们遇到同样的问题,也只在iPad 2硬件上。模拟器正常工作。 https://github.com/apptentive/apptentive-ios/issues/148 – pkamb
你介意在这里添加你的'rootViewController'解决方案作为“答案”吗?也许有代码示例和/或截图。谢谢!如果我找到解决方案,我也会回答。 – pkamb
@pkamb - 没问题。我已经添加了我们用来解决问题的代码片段。 –