iPad/iOS7:'页面'模式视图控制器奇怪的行为后,从它呈现'全屏'视图控制器

Vit*_* S. 8 ipad ios ios7

我的iPad应用程序打开带有"页面"演示风格的模态视图控制器.如您所知,"页面"演示文稿样式不包括呈现视图控制器以指示页面显示的状态栏.

初始视图控制器

页面模态视图控制器

从模态视图控制器,应用程序打开UIImagePickerController以制作照片.UIImagePickerController拥有'全屏'演示风格.解散图像选择器呈现模态视图控制器变为20px更高并重叠初始视图控制器的状态栏.

我试图UIImagePickerController用简单的替换,UINavigationController它也打破了我的模态视图控制器.

屏幕截图: 全屏视图控制器

破碎的模态视图控制器

他们只有恢复'Page'视图控制器大小的方法是viewController.view.superview.superview.superview.superview在返回'Page'视图控制器后改变帧的高度.但这真的很奇怪.

在解除嵌套模态视图控制器后,是否有另一种方法来修复"页面"模态视图控制器演示?

更新: 我使用这些奇怪的代码来解决我的问题:

#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;
Run Code Online (Sandbox Code Playgroud)

我不相信没有更优雅的解决方案.任何想法如何改进它?

更新2:我刚刚开了一个bug.你可以在那里关注:rdar:// 15949644

更新3:有我的示例项目:链接

Leo*_*ica 2

没有好的解决方案,这是苹果的一个错误,在它被修复之前,你必须解决它。iOS 7.1 中尚未修复此问题。我研究了一个解决方案,并意识到我也在实施相同的解决方案。它很丑,但很有效。

关于这个设计的一句话。我猜测苹果忽视这个问题的原因是因为全屏显示视图控制器不是苹果会做的事情。当然,这不是借口,有时除了全屏显示之外别无选择(例如,我们必须打开相机视图,必须以全屏打开)。也许你可以改变你的设计来适应苹果的错误。