【发布时间】:2014-02-04 11:24:53
【问题描述】:
我的 iPad 应用程序以“页面”呈现样式打开模态视图控制器。如您所知,“页面”展示样式不覆盖展示视图控制器的状态栏以指示页面展示。
应用程序从模态视图控制器打开UIImagePickerController 以制作照片。 UIImagePickerController 具有“全屏”演示风格。关闭图像选择器后呈现模态视图控制器变得高 20px 并与初始视图控制器的状态栏重叠。
我试图用简单的UINavigationController 替换UIImagePickerController,它也破坏了我的模态视图控制器。
有截图:
他们恢复“页面”视图控制器大小的唯一方法是在返回“页面”视图控制器后更改viewController.view.superview.superview.superview.superview 框架的高度。但这真的很奇怪。
在解除嵌套的模态视图控制器后,是否有另一种方法来修复“页面”模态视图控制器的呈现?
更新: 我用这样奇怪的代码来解决我的问题:
#define STATUS_BAR_HEIGHT 20
#define IPAD_PORTRAIT_HEIGHT 1004
#define IPAD_LANDSCAPE_HEIGHT 748
UIView *superview = nil;
// In case of this view controller included in navigationController we have to use superview of navigation's controller view
if (self.navigationController)
superview = self.navigationController.view.superview;
else
superview = self.view.superview;
CGRect r = superview.frame;
// Sometimes we have to fix height + origin, sometimes only height (becase view has bottom magnifying)
// In landscape orientation we have to fix 'width' instead of 'height', because that view controller always works in 'portrait' mode
if (self.interfaceOrientation == UIInterfaceOrientationPortrait && r.size.height > IPAD_PORTRAIT_HEIGHT) {
r.origin.y = STATUS_BAR_HEIGHT;
r.size.height = IPAD_PORTRAIT_HEIGHT;
}
else if (self.interfaceOrientation == UIInterfaceOrientationMaskPortraitUpsideDown && r.size.height > IPAD_PORTRAIT_HEIGHT) {
r.size.height = IPAD_PORTRAIT_HEIGHT;
}
else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft && r.size.width > IPAD_LANDSCAPE_HEIGHT) {
r.size.width = IPAD_LANDSCAPE_HEIGHT;
r.origin.x = STATUS_BAR_HEIGHT;
}
else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight && r.size.width > IPAD_LANDSCAPE_HEIGHT) {
r.size.width = IPAD_LANDSCAPE_HEIGHT;
}
superview.frame = r;
我不相信没有更优雅的解决方案。任何想法如何改进它?
UPDATE2:我刚刚打开了一个错误。你可以在那里关注它:rdar://15949644
UPDATE3:这是我的示例项目:link
【问题讨论】:
-
这是一个已知的 Apple 错误。在 iOS7.1 中尚未修复。确保打开错误报告。
-
@LeoNatan,你在其他地方见过这个问题吗?在打开错误报告之前,我想收集更多详细信息。
-
是的,在我们自己的应用程序中。我们有一个模态页面表单视图控制器,它以全屏显示相机视图控制器,并且在关闭后我们会遇到相同的视觉异常。我们认为这是小问题,所以我们只打开了一个错误报告,并没有寻找解决方法。我可以在周末看一看,看看是否能想出一个更优雅的解决方法,也许在布局系统的某个地方,但我不能做出任何承诺。
-
@LeoNatan,无论如何感谢您的信息。我会在打开错误报告后更新我的问题。
-
这很容易重现,您的解决方法很好。