自定义UIBarButtonItem

7
我正在尝试创建一个自定义的UIBarbuttonItem,只使用带透明度的png文件作为按钮图标。当我尝试设置按钮图像、将背景设置为白色并将样式设置为Plain时,仍然会得到内部阴影和黑色边框。
这是怎么回事?
我已经尝试了下面的代码,但它仍然会在周围加上黑色边框。
UIImage *background = [UIImage imageNamed:@"Dismiss_normal.png"];
UIImage *backgroundSelected = [UIImage imageNamed:@"Dismiss_selected.png"];
self.closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.closeButton addTarget:self action:@selector(closeButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; //adding action
[self.closeButton setBackgroundImage:background forState:UIControlStateNormal];
[self.closeButton setBackgroundImage:backgroundSelected forState:UIControlStateSelected];
self.closeButton.frame = CGRectMake(0 ,0,background.size.width, background.size.height);
self.closeButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.closeButton];
self.navigationItem.leftBarButtonItem = self.closeButtonItem;

我注意到的是,如果我使用模态转换视图控制器,按钮仍然会有黑色边框,而如果我使用推送转换视图控制器则不会有?WTF?
6个回答

15

您必须将按钮类型设置为Custom(自定义),并将图标图像设置为按钮的背景

UIImage *background = [UIImage imageNamed:@"icon.png"];
UIImage *backgroundSelected = [UIImage imageNamed:@"icon_selected.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; //adding action
[button setBackgroundImage:background forState:UIControlStateNormal];
[button setBackgroundImage:backgroundSelected forState:UIControlStateSelected];
button.frame = CGRectMake(0 ,0,35,35);

然后将此按钮设置为您的 BarButtonItem,如下所示:

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = barButton;

1
您需要确保用户在触摸按钮时没有任何问题,为此,您应该分配一个带有所需触摸边界的新UIView,然后将按钮添加到此视图中,然后使用新分配的视图初始化barButton。 - A'sa Dickens

7
我理解了你的问题。
当你实际推送一个UIViewController时,它将成为现有UINavigationController的一部分。因此,UINavigationBar会保留。但是,当你使用ModalViewController时,它只是另一个UIViewController,类似于添加到现有的UIViewController中。因此,UINavigationBar不会出现。
但是你可以从xib中添加另一个UINavigationBar并添加一个UIButton。但是不要直接添加UIButton,如果这样做,它会自动转换为UIBarButton,使其带边框。
所以,首先将普通的UIButton拖到你的UIView(而不是导航栏)中。将其更改为“custom”并使用“Attribute Inspector”向其中添加UIImage。然后将该图像拖到你自定义创建的UINavigationBar中。我刚刚尝试过,它会起作用。你可以看到下面附加的屏幕截图。

enter image description here


实际上,您甚至无法从使用模态方式呈现的视图控制器中访问导航栏。因此,您必须添加自己的UINavigationBar(自定义)。 - Javvadi Rajesh
我按照你的步骤进行操作,但是这种按钮行为不起作用。 @property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton; 给出Outlet动作,但按钮动作不起作用。 - San

4

这将会更新整个应用程序中的所有返回按钮和导航栏。

我使用了以下代码来设置自定义导航栏后退按钮:

UIImage *imgBack = [[UIImage imageNamed:@"nav_back.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(-6, 22, -6, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:imgBack forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

设置导航栏背景图片的代码如下:
UIImage *navBackgroundImage = [UIImage imageNamed:@"nav_bar.png"];
[[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault];

1
值得解释的是,这将更新应用程序中所有返回按钮和导航栏 - 可能是最好的答案。 - Brody Robertson
子类化UINavigationController并在其中修改导航栏,然后使用该子类作为您的主要导航工具。 - A'sa Dickens

3

尝试使用[UIBarButtonItem initWithCustomView]。

UIImage *menuButtonImage = [UIImage imageNamed:@"list.png"];// set your image Name here 
UIButton *btnToggle = [UIButton buttonWithType:UIButtonTypeCustom];
[btnToggle setImage:menuButtonImage forState:UIControlStateNormal];
btnToggle.frame = CGRectMake(0, 0, menuButtonImage.size.width, menuButtonImage.size.height);
UIBarButtonItem *menuBarButton = [[UIBarButtonItem alloc] initWithCustomView:btnToggle];
self.navigationItem.leftBarButtonItem = menuBarButton;

1
我个人喜欢FlatUIKit的方法,只需通过UIAppearance将整个UI平坦化即可。
基本上,您需要这样做:
UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color barMetrics:UIBarMetricsDefault cornerRadius:cornerRadius];
UIImage *highlightedBackButtonPortraitImage = [UIImage backButtonImageWithColor:highlightedColor barMetrics:UIBarMetricsDefault cornerRadius:cornerRadius];

[appearance setBackButtonBackgroundImage:backButtonPortraitImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[appearance setBackButtonBackgroundImage:highlightedBackButtonPortraitImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

UIImage *buttonImageNormal       = [UIImage imageWithColor:color cornerRadius:cornerRadius];
UIImage *buttonImageHightlighted = [UIImage imageWithColor:highlightedColor cornerRadius:cornerRadius];

[appearance setBackgroundImage:buttonImageNormal forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[appearance setBackgroundImage:buttonImageHightlighted forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

0

试试这段代码...

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *btnImage = [UIImage imageNamed:@"bg"];
[button setImage:btnImage forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, btnImage.size.width, btnImage.size.height);
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
UIImage *icon = [UIImage imageNamed:@"icon"]
UIImageView *iconView = [[UIImageView alloc] initWithImage:icon];
iconView.frame = CGRectMake(0, 0, icon.size.width, icon.size.height);
[button addSubview:iconView];
iconView..userInteractionEnabled=NO;
[iconView centerBothDirections];
[iconView release];
UIBarButtonItem *barbtn = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];
self.navigationItem.leftBarButtonItem =barbtn

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