2011-02-03 139 views
3

我有一个包含4个选项卡的应用程序。每个选项卡都是一个UINavigationController。 4个UINavigationBar标签应该看起来相同,有一个自定义背景图像,一个自定义backButton和一个自定义右键触发一个函数。iPhone自定义UINavigationBar按钮

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

回答

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; 

和写入返回按钮的动作事件。

-(IBAction)gotoBack:(id)sender 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

谢谢,但我必须写在每个RootViewController的代码(每个NavigationController )。我想要的是只能为所有NavigationControllers编写一次代码,就像我在appDelegate中为类别创建背景图像一样。 – 2011-02-03 12:57:34

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

祝你好运!

3

在aplicationDidFinishLaunching您的appdelegate .....

UIImage *navBG = [UIImage imageNamed:@"barra-logo-centro.png"]; 

[[UINavigationBar appearance] setBackgroundImage:navBG forBarMetrics:UIBarMetricsDefault]; 

//backbutton: 22x30 , [email protected] 

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

[[UIBarButtonItem appearance] setBackgroundImage:[UIImage imageNamed:@"normal_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

这将改变整个导航栏proyect和栏按钮项目