【问题标题】:iOS 7 Modal presents below status bariOS 7 模态显示在状态栏下方
【发布时间】:2013-11-15 22:59:47
【问题描述】:

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

层级如下:

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 中运行它,就会出现这个问题。

例如:

see screenshots

红色视图是视图控制器 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 个示例项目 here,它们显示了呈现模式的选项卡栏应用程序和呈现模式的非选项卡栏项目之间的区别。两者的设置方式相同,只有 3 个视图控制器。

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

奥利

【问题讨论】:

  • 您添加的每个视图的框架是什么?
  • vc1 的框架设置为与其父视图的边界相同的大小。 vc2 的框架是由 presentViewController 方法设置的,你永远不会为模态框设置框架。
  • 我遇到了完全相同的问题。我注意到,如果您进行旋转,它会绘制模态视图“全屏”,而不会显示当前视图的状态栏

标签: iphone ios objective-c ipad


【解决方案1】:

我找到了答案。

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

  [self presentViewController:animated:completion:]

被调用。

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

[self addChildViewController:viewController]

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

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

[viewController removeFromParentViewController];

这解决了上面的问题。

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。奇怪的是,如果模式是从包含在选项卡栏中的视图控制器呈现的,它会填满整个屏幕,如果不是从选项卡栏呈现,它不会。因此,标签栏必须在视图控制器上设置一些属性,以便它告诉模态框填满屏幕。 (我这样做的原因是我正在创建一个自定义标签栏,一旦我停止从 UITabBar 继承这个问题就开始了)
    猜你喜欢
    • 2013-12-08
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多