所以,我试图在 Application UIWindow 上实现一个固定的顶部横幅和多个视图控制器的工作导航。我知道还有其他方法可以执行此操作,但对于我的项目要求,我需要使用 xibs。
下面的代码允许实现这一点:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.headerView = [[UIImageView alloc] init];
self.headerView.frame = CGRectMake(0.0f, 20.0f, 320.0f, 44.0f);
self.headerView.image = [UIImage imageNamed: @"header-banner-background.png"];
[self.window addSubview:self.headerView];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
}
然后在每个 ViewController viewWillAppear 方法中,我调整了 self.view 和 self.navigationController.navigationBar.frame 的大小,以便在横幅下方显示自己:
self.navigationController.navigationBar.frame = CGRectMake(0, 64, 320, 44);
self.view.frame = CGRectMake(0, 64, 320, 396);
这很好,完全按照我想要的方式工作。
但是如果用户按下主页按钮并且应用程序退出活动状态,当它再次变为活动状态时,最后一个 viewController 会显示但没有 UIWindow 横幅,并且 self.view 和 navigationBar 显示在顶部。
当然,当前的 UIViewController viewWillAppear 方法在应用程序返回活动时不会被调用,但即使我将调整大小代码放在另一个函数中并通过通知调用它也不起作用。但是当用户按下一个 bar item 并在导航堆栈中移动时,一切都会再次运行,UIWindow 会显示 headerView。
任何人都明白为什么当应用程序返回活动时 UIWindow headerView 会消失?
编辑1:可能的解决方案?
@interface RootViewController ()
{
ViewController *viewController;
UINavigationController *navigationController;
}
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
}
return self;
}
- (void)loadView
{
// Implement loadView to create a view hierarchy programmatically, without using a nib.
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 88)];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[imageView setImage:[UIImage imageNamed:@"header"]];
[view addSubview:imageView];
navigationController.navigationBar.frame = CGRectMake(0, 44, 320, 44);
[view addSubview:navigationController.navigationBar];
self.view = view;
}
编辑 2:第二种可能的解决方案,仍然无法正常工作
- (void)loadView
{
NSLog(@"loadView root");
// Implement loadView to create a view hierarchy programmatically, without using a nib.
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 88)];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[imageView setImage:[UIImage imageNamed:@"banner"]];
[view addSubview:imageView];
navigationController = [[UINavigationController alloc] init];
navigationController.navigationBar.frame = CGRectMake(0, 43, 320, 44);
[view addSubview:navigationController.navigationBar];
[self addChildViewController:navigationController];
self.view = view;
[self.view setBackgroundColor:[UIColor yellowColor]];
}
这是结果,看起来很好,没有 viewController1 的推送(注意黄色背景来自 rootViewController):
相反,这是添加的结果:
- (void)viewDidLoad
{
viewController1 = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
[navigationController pushViewController:viewController1 animated:YES];
}
新的视图控制器没有被推送(背景应该是黑色的)并且导航栏已经消失了。
编辑 3:Olloqui 解决方案,仍然无法正常工作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setBackgroundColor:[UIColor redColor]];
UIView *bannerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[self.window addSubview:bannerView];
UIView *navigationView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 416)];
ViewController1 *viewController1 = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController1];
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44);
[navigationView addSubview:self.navigationController.navigationBar];
[self.window addSubview:navigationView];
self.window.rootViewController = self.navigationController;
self.window.autoresizesSubviews = YES;
[self.window makeKeyAndVisible];
return YES;
}
结果是我只有横幅,viewController1 被推送但没有显示导航栏。我真的需要弄清楚这一点,有人有不同的方法吗?