我有一个带有4个标签的应用程序。每个选项卡都是UINavigationController。 4个UINavigationBar选项卡应该看起来相同,具有自定义背景图像,自定义backButton和触发功能的自定义右键。
我想在我的代码中只进行一次自定义,而不是在每个RootViewController中进行。
我设法通过将此代码插入我的appDelegate:
来获得自定义背景图片 @implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"MyNavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
但我没有设法自定义后退和右按钮或指定右按钮的操作。
有没有办法在appDelegate中这样做,就像背景图片一样? 或者我应该在每个RootViewController中进行自定义吗?
答案 0 :(得分:13)
在viewWillAppear
方法
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *butImage = [[UIImage imageNamed:@"back.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:10];
[button setBackgroundImage:butImage forState:UIControlStateNormal];
[button addTarget:self action:@selector(gotoBack:) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(0, 0, 48, 30);
UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];
self.navigationItem.leftBarButtonItem = backButton;
并为backButton编写动作事件。
-(IBAction)gotoBack:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
答案 1 :(得分:3)
在你的appdelegate中的applicationDidFinishLaunching .....
UIImage *navBG = [UIImage imageNamed:@"barra-logo-centro.png"];
[[UINavigationBar appearance] setBackgroundImage:navBG forBarMetrics:UIBarMetricsDefault];
//backbutton: 22x30 , 44x60@2x
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackgroundImage:[UIImage imageNamed:@"normal_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
这将修改完整的项目导航栏和条形按钮ítems
答案 2 :(得分:1)
Renungas的回答很好。
如果你不想写4次相同的代码,你可以 总是子类UINavigationController。
我刚尝试过这个解决方案(带子类UITabBarController,但不过......) 它运作正常。
您可以找到类似的示例here
您的自定义代码(与上述示例相同)应如下所示:
- (void)loadView {
[super loadView];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"backbutton.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(0, 0, 32, 32)];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
}
- (void)backAction {
[self.navigationController popViewControllerAnimated:YES];
}
正如您所看到的,您只需覆盖loadView并添加方法即可 执行popVievController选择器。
祝你好运!