iPhone自定义UINavigationBar按钮

时间:2011-02-03 11:26:37

标签: iphone

我有一个带有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中进行自定义吗?

3 个答案:

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

祝你好运!