3

我试图从一个视图控制器中以模态方式呈现一个视图,该视图控制器包含在另一个视图控制器中(例如,一个标签栏控制器,包含一个视图控制器,以模态方式呈现另一个视图控制器)。

层次结构如:

View Controller 1
    view 1 (belonging to view controller 1)
         view 2 (belonging to view controller 2)
            -> presented view 3 (belonging to view controller 3)

我遇到的问题是,在 ipad 上,呈现的视图控制器出现在状态栏下方,而呈现的视图控制器在状态栏后面可见。我希望视图填满整个屏幕并坐在状态栏后面。

奇怪的是,如果我从视图控制器 1 呈现模态,它工作正常,如果我尝试从视图控制器 2 呈现它,我会遇到这个问题。

另一个奇怪的事情是,如果我在 iphone 模拟器中运行相同的代码,没有问题,可以按预期工作,但是如果我在 ipad sim 中运行它,就会出现这个问题。

例如:

看截图

红色视图是属于视图控制器 2 的视图,绿色是视图控制器 3。

如您所见,在 iphone 上,视图控制器 3 覆盖了整个屏幕,而在 ipad 上,它位于状态栏下方。

为了测试这一点,在 xcode 中创建一个新的单视图通用项目,并将以下代码添加到创建的视图控制器中的 viewDidAppear 方法中,并在 iphone 和 ipad 模拟器中运行:

-(void)viewDidAppear:(BOOL)animated
{
    UIViewController *vc1 = [UIViewController new];
    vc1.view.backgroundColor = [UIColor redColor];
    [self.view addSubview:vc1.view];

    UIViewController *vc2 = [UIViewController new];
    vc2.view.backgroundColor = [UIColor greenColor];

    [vc1 presentViewController:vc2 animated:YES completion:nil];
}

有人有什么想法吗?根据苹果过渡指南,我已经尝试了新的 edgesForExtendedLayout 属性等的所有组合。我必须避免向 vc2 添加任何内容。

在此处创建了 2 个示例项目,显示了呈现模式的选项卡栏应用程序和呈现模式的非选项卡栏项目之间的区别。两者都以相同的方式设置,具有 3 个视图控制器。

iphone和ipad之间的差异似乎很奇怪。

奥利

4

2 回答 2

3

我找到了答案。

将子视图控制器(将呈现模态的那些)添加到父视图控制器时,您必须告诉父视图控制器子视图控制器确实是子视图,这会影响模态上下文

  [self presentViewController:animated:completion:]

叫做。

你可以通过调用来做到这一点:

[self addChildViewController:viewController]

当您添加子视图控制器时。

如果您从父级移除视图控制器,则必须调用:

[viewController removeFromParentViewController];

这解决了上面的问题。

注意,iPhone 和 iPad 之间的模态显示上下文是不同的,iPhone 将始终全屏显示模态视图控制器,无论如何,在 iPad 上,呈现视图控制器需要知道什么上下文来显示模态视图控制器(基本上谁是父视图控制器)。

希望这可以帮助。

于 2013-11-15T14:59:47.083 回答
0

这就是模式视图在 iPad 上的呈现方式。它旨在成为向用户展示深度的功能,而不是错误。

就 iPhone modals 而言,它们目前总是占据全屏。您不应认为这种行为是永久性的;Apple 可能会决定在未来的 iPhone 操作系统/SDK 更新中保留状态栏。

但是,您在帖子中描述的内容(从模态显示的 vc 模态显示 vc)偶尔会覆盖状态栏(我注意到,如果您从 Page Sheet 模态显示全屏模态,则会发生这种行为)。我相信这种行为是 iOS7 的错误,将在以后的 SDK 或操作系统更新中修复。

于 2013-10-17T20:06:39.483 回答