iPhone自定义UINavigationBar按钮

3

我有一个包含4个选项卡的应用程序。每个选项卡都是一个导航控制器。这4个导航栏选项卡应该看起来相同,具有自定义背景图像、自定义返回按钮和触发函数的自定义右侧按钮。

我希望只在我的代码中进行这些自定义一次,而不是在每个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中进行定制?

3个回答

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

谢谢,但我必须在每个RootViewController(对于每个NavigationController)中编写此代码。我想要的是只需为所有NavigationControllers编写一次代码,就像我在appDelegate中使用类别为背景图像所做的那样。 - Sébastien
在这种情况下,创建一个封装了上述方法的对象,并在每个适用的类中调用它。您可以将图像、选择器和按钮框架作为参数传递。 - user298261

3
在您的appdelegate中的aplicationDidFinishLaunching方法中...
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];

这将修改整个项目导航栏和工具栏按钮项。

1

Renungas的答案很好。

如果你不想重复写4遍相同的代码,你可以通过子类化UINavigationController实现。

我刚试了一下这个解决方案(虽然用的是子类化UITabBarController,但仍然有效),它运行正常。

你可以在这里找到类似的示例。

你自定义的代码(与上述示例相同)应该是这样的:

    - (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选择器。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接