包含 UINavigationController 的状态栏大小不正确

Status bar sized incorrectly with a contained UINavigationController

我通过 containment 使 UINavigationController 成为另一个视图控制器的子级。一切正常,除了在 通话状态栏 打开的情况下启动应用程序时发生的奇怪问题,然后在应用程序 UI 打开后将其关闭屏幕。状态栏出现奇怪的黑色缺口

考虑下面的独立示例应用程序:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)opt
{
  // Content
  UILabel * aLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 200, 40)];
  aLbl.text = @"In-call status bar issue";

  UIViewController * aContent = [[UIViewController alloc] init];
  aContent.title = @"Title";
  aContent.view.backgroundColor = UIColor.whiteColor;
  [aContent.view addSubview:aLbl];

  UINavigationController * aNav = [[UINavigationController alloc]
    initWithRootViewController:aContent];

  // Parentmost view controller containing the navigation view controller
  UIViewController * aParent = [[UIViewController alloc] init];
  [aParent.view addSubview:aNav.view];
  [aParent addChildViewController:aNav];
  [aNav didMoveToParentViewController:aParent];

  self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
  self.window.rootViewController = aParent;
  [self.window makeKeyAndVisible];

  return YES;
}
@end

int main(int argc, char ** argv)
  { @autoreleasepool { return UIApplicationMain(argc, argv, nil, @"AppDelegate"); } }

重现问题的最简单方法是:

  1. 启动 iOS 模拟器。
  2. 按 ⌘+Y 打开通话状态栏。状态栏会变宽变绿。
  3. 手动启动应用程序并等待导航控制器出现。
  4. 再次按 ⌘+Y 关闭通话状态栏。

UI 现在应该如下所示:

有人知道如何解决这个问题吗?

您正在将一个视图(导航控制器的视图)作为子视图添加到另一个视图(父视图控制器的视图),而没有给它一个框架!这是你不应该做的事情。

只需将这些行添加到您的代码中:

aNav.view.frame = aParent.view.bounds;
aNav.view.autoresizingMask = 
    UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

现在导航控制器的视图有一个框架,并维护它与其父视图的关系。