将UIButton用作UINavigationbar按钮

7

我有一个选项卡应用程序,在其中一个选项卡中,我有一个导航控制器。 我试图将一个带有图像的UIButton设置为导航栏的右侧按钮。

    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。
2个回答

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

--

根据评论更新

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

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属性设置为在按下按钮时视觉上突出显示该按钮。


问题是我想要按钮样式是纯色的或者背景透明。UIBarButtonItemStyleBordered或其他任何样式都会把图像放在一个框里。这就是为什么我使用了一个UIButton。 - Rupert
你应该在问题中提到这一点。像我展示的那样将按钮添加到导航栏中,即使你将其设置为纯样式,它也会始终显示边框,正如你所指出的那样。我认为文档中甚至已经提到了这一点。 - ynnckcmprnl
现在它显示了图片,但是我点击它却没有反应。我已经尝试了[rightButton setTarget:self];[rightButton setAction:@selector(refresh:)]; - Rupert

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

现在它可以正常工作了,但我不确定这是否是正确的做法。


虽然这样可能有效,但我认为使用UIBarButtonItem更加简洁。 - ynnckcmprnl

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