编辑2: 我现在已经解决了这个问题。我正在为我的UINavigationBar设置自定义背景图像,如下所示:
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[navBar addSubview:imgView];
[navBar sendSubviewToBack:imgView];
[imgView release];
对于UINavigationController的视图控制器堆栈上的第一个视图控制器来说这很好,但是任何子视图都会重新运行此代码并将自定义背景放在前面。
修复: 只需在导航控制器上删除自定义背景的所有代码,然后按以下方式扩展UINavigationBar类:
创建一个名为UINavigationBar + CustomImage的新.h / .m文件。将.h代码设置为:
@interface UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect;
@end
.m到:
#import "UINavigationBar+CustomImage.h"
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBarBackground.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
瞧!现在一切都很好。
---结束编辑2 ---
我有一个UINavigationController,可以这样钻取:
HOMEPAGE > DETAIL PAGE > MAP VIEW
DETAIL PAGE将自定义UIToolbar(带有三个按钮)添加到viewDidLoad中的rightBarButtonItem,如下所示:
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 1.0, 157.0, 44.1)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[tools addSubview:imgView];
[tools sendSubviewToBack:imgView];
[tools setTintColor:[UIColor colorWithRed:127/255.0 green:184/255.0 blue:72/255.0 alpha:1.0]];
[imgView release];
NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];
UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithTitle:@"Filter" style:UIBarButtonItemStyleBordered target:self action:NULL];
[buttons addObject:bi];
[bi release];
bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Map.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showMap:)];
[buttons addObject:bi];
[bi release];
bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Favourite.png"] style:UIBarButtonItemStyleBordered target:self action:NULL];
[buttons addObject:bi];
[bi release];
[tools setItems:buttons animated:NO];
[buttons release];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];
在查看DETAIL VIEW页面时显示完美,当我转到MAP VIEW时,自定义UIToolbar消失(按预期方式),但是,当返回DETAIL VIEW时,自定义UIToolbar不再可见。但是,它仍然存在,因为我仍然可以点击“地图”按钮所在的区域,并将其推回到MAP VIEW。
您是否知道如何在返回DETAIL视图时再次显示此UIToolbar?
我尝试在viewWillAppear中重建自定义UIToolbar,它具有与上面完全相同的效果。
编辑 - 如果我在viewDidAppear方法中放置构建自定义UIToolbar的代码,则此方法有效。我不喜欢这个解决方案,因为视图向后滑动,然后出现自定义rightBarButtonItem。这是否与导航控制器在页面显示之前未被初始化有关?
答案 0 :(得分:1)
如果它在viewDidAppear中有效,你可以试试viewWillAppear。一般来说,我从未见过将UIToolbar设置为UIBarButtonItem,因此我不一定会期望标准行为。让我知道它是怎么回事。
答案 1 :(得分:0)
Apple UI API经常以不寻常的方式失败,当你尝试做任何甚至有点不寻常的事情时(甚至 应该工作的东西),并且尝试将UIToolbar插入到rightBarButtonItem中肯定属于我的定义“异常”。
您真正应该做的是隐藏导航栏并将UIToolbar添加为视图控制器主视图的子视图。或者,您可以完全避免使用UIToolbar,并在自定义视图中自行实现这些按钮。