包含 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"); } }
重现问题的最简单方法是:
- 启动 iOS 模拟器。
- 按 ⌘+Y 打开通话状态栏。状态栏会变宽变绿。
- 手动启动应用程序并等待导航控制器出现。
- 再次按 ⌘+Y 关闭通话状态栏。
UI 现在应该如下所示:
有人知道如何解决这个问题吗?
您正在将一个视图(导航控制器的视图)作为子视图添加到另一个视图(父视图控制器的视图),而没有给它一个框架!这是你不应该做的事情。
只需将这些行添加到您的代码中:
aNav.view.frame = aParent.view.bounds;
aNav.view.autoresizingMask =
UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
现在导航控制器的视图有一个框架,并维护它与其父视图的关系。
我通过 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"); } }
重现问题的最简单方法是:
- 启动 iOS 模拟器。
- 按 ⌘+Y 打开通话状态栏。状态栏会变宽变绿。
- 手动启动应用程序并等待导航控制器出现。
- 再次按 ⌘+Y 关闭通话状态栏。
UI 现在应该如下所示:
有人知道如何解决这个问题吗?
您正在将一个视图(导航控制器的视图)作为子视图添加到另一个视图(父视图控制器的视图),而没有给它一个框架!这是你不应该做的事情。
只需将这些行添加到您的代码中:
aNav.view.frame = aParent.view.bounds;
aNav.view.autoresizingMask =
UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
现在导航控制器的视图有一个框架,并维护它与其父视图的关系。