0

编辑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 向 viewDidLoad 中的 rightBarButtonItem 添加了一个自定义 UIToolbar(带有三个按钮),如下所示:

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];

这在查看详细视图页面时完美显示,当我转到地图视图时,自定义 UIToolbar 消失(如预期的那样),但是,当返回详细视图时,自定义 UIToolbar 不再可见。但是,它就在那里,因为我仍然可以点击“地图”按钮所在的区域,它会将我推回到地图视图。

你知道当返回到 DETAIL 视图时如何让这个 UIToolbar 再次显示吗?

我尝试在 viewWillAppear 中重建自定义 UIToolbar,效果与上面完全相同。

编辑- 如果我将构建自定义 UIToolbar 的代码放在 viewDidAppear 方法中,这将起作用。不过我不喜欢这个解决方案,当视图向后滑动时,定义的 rightBarButtonItem 就会出现。这与在显示页面之前未初始化导航控制器有关吗?

4

2 回答 2

1

如果它在 viewDidAppear 中有效,您可以尝试 viewWillAppear。一般来说,我从未见过将 UIToolbar 设置为 UIBarButtonItem,因此我不一定会期望标准行为。让我知道事情的后续。

于 2010-11-19T14:34:25.577 回答
0

当您尝试做任何稍微不寻常的事情(甚至应该起作用的事情)时,Apple UI API 经常以不寻常的方式失败,并且尝试将 UIToolbar 插入 rightBarButtonItem 肯定属于我对“不寻常”的定义。

您真正应该做的是隐藏导航栏并将 UIToolbar 添加为视图控制器主视图的子视图。或者,您可以完全避免 UIToolbar 并在自定义视图中自己实现按钮。

于 2010-11-21T15:05:30.373 回答