2010-09-30 79 views
7

我有一个选项卡栏应用程序。并在其中一个标签栏中有一个导航控制器。 我试图设置一个图像的UIButton作为导航栏的右键。UIButton作为UINavigationbar按钮

UIButton *refreshButton = [[UIButton alloc] init]; 
    [refreshButton setImage:[UIImage imageNamed:@"refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refreshSection) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:refreshButton]; 
    //[rightButton setImage:[UIImage imageNamed:@"refresh_icon.png"]]; << DOESN'T WORK EITHER 
    self.navigationItem.rightBarButtonItem = rightButton; 
    [refreshButton release]; 
    [rightButton release]; 

但图像不显示。我得到一个不可见的按钮。

编辑: 我希望按钮风格是纯色或背景是透明的,以便只有图像显示。因此,我使用的是一个UIbutton,而不是直接使用UIBarButton。

回答

22

您不必创建UIButton并将其用作UIBarButtonItem中的自定义视图。您可以直接创建一个UIBarButtonItem与图像:

UIImage *myImage = [UIImage imageNamed:@"myImage.png"]; 
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStyleBordered target:self action:@selector(refreshSection)]; 
self.navigationItem.rightBarButtonItem = button;  
[button release]; 

-

更新,根据意见

使用UIImageView作为UIBarButtonItem自定义视图:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]]; 
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:imageView]; 
self.navigationItem.rightBarButtonItem = rightButton; 
[imageView release]; 
[rightButton release]; 

-

更新

尝试最后的办法,虽然这也直观地看起来像你想它,我似乎无法得到它来处理水龙头。虽然目标和行动已经确定。

-

最后更新

我已经得到了在这个问题您最初的代码了&运行。图像没有显示的原因是因为你没有设置按钮的框架。设置好框架后,图像会显示在导航栏中。

这里是我的代码段我用&测试:

UIImage *myImage = [UIImage imageNamed:@"paw.png"]; 
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[myButton setImage:myImage forState:UIControlStateNormal]; 
myButton.showsTouchWhenHighlighted = YES; 
myButton.frame = CGRectMake(0.0, 0.0, myImage.size.width, myImage.size.height); 

[myButton addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:myButton]; 
self.navigationItem.rightBarButtonItem = rightButton; 

[rightButton release]; 
[myButton release]; 

注:我UIButtonshowsTouchWhenHighlighted属性设置为在视觉上被按下时,它hightlight按钮。

+0

事情是我想要按钮样式是平原或背景是透明的。 UIBarButtonItemStyleBordered或其他任何东西把图像放在一个盒子里。这就是为什么我使用uibutton – Rupert 2010-09-30 08:04:22

+0

你应该在你的问题中提到。正如你指出的那样,在我展示的导航栏中添加一个按钮将始终使用边框显示它,即使将其设置为普通样式也是如此。我认为它甚至在文档中提到。 – 2010-09-30 08:07:57

+0

现在它显示图像,但点击它时没有任何反应。我试过[rightButton setTarget:self]; [rightButton setAction:@selector(refresh :)]; – Rupert 2010-09-30 08:26:58

1

我终于实现了这个

UIButton *refreshButton = [[UIButton alloc] initWithFrame:CGRectMake(292, 9, 27, 27)]; 
    [refreshButton setImage:[UIImage imageNamed:@"refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refresh) forControlEvents:UIControlEventTouchUpInside]; 
    [self.navigationController.navigationBar addSubview:refreshButton]; 
    [refreshButton release]; 

现在工作正常,但我真的不知道,如果这是这样做的正确方法。

+0

虽然这可能有效,但我认为使用'UIBarButtonItem'更清洁。 – 2010-09-30 09:05:59