如何在iOS 7中设置UIBarButtonItem选中或突出显示的图像或色调?

如何在iOS 7中向uibarbuttonitem提供正常状态和选中/突出显示的状态图像? 有没有办法为uibarbuttonitem的正常和选定/突出显示状态提供色调?

我不想使用uibutton作为uibarbuttonitem的视图! 任何优雅的解决方案将非常受欢迎。

您可以将UIButton用作customViewUIBarButtonItem并为UIButton的normalselected状态提供两个不同的背景图像。 然后,当点击按钮时,您可以将selected状态设置为YESNO

 // Build right bar button UIImage *normalButtonImage = [UIImage imageNamed:@"normal-button"]; UIImage *selectedButtonImage = [UIImage imageNamed:@"selected-button"]; CGRect rightButtonFrame = CGRectMake(0, 0, normalButtonImage.size.width, normalButtonImage.size.height); UIButton *rightButton = [[UIButton alloc] initWithFrame:rightButtonFrame]; [rightButton setBackgroundImage:normalButtonImage forState:UIControlStateNormal]; [rightButton setBackgroundImage:selectedButtonImage forState:UIControlStateSelected]; [rightButton addTarget:self action:@selector(rightBarButtonPress) forControlEvents:UIControlEventTouchDown]; [orientationButton setShowsTouchWhenHighlighted:YES]; [orientationButton setSelected:NO]; UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc] initWithCustomView:rightButton]; [self.navigationItem setRightBarButtonItem:rightBarButton]; 

然后在单击按钮时的in方法中,更改状态

 - (void)rightBarButtonPress { //toggle selected state of button UIBarButtonItem *rightBarButton = self.navigationItem.rightBarButtonItem; UIButton *button = (UIButton *)rightBarButton.customView; [button setSelected:!button.selected]; //do whatever else you gotta do } 

您可以使用UIAppearance协议参考来完成此操作

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, [UIColor clearColor], UITextAttributeTextShadowColor, nil]; [[UIBarButtonItem appearance] setTitleTextAttributes:options forState:UIControlStateNormal]; 

您可能还必须使用:

 [[UINavigationBar appearance] setTintColor:[UIColor redColor]]; 

根据这个答案 ,我做了一些额外的事情,在这里有一个答案。 我有自定义的UITabBarController,它与StoryBoard文件中的UITabBarController链接。 因此,为了在取消选择TabBar时删除iOS提供的自动色调,我最终以这种方式删除它。 图像可以是各种各样的图像,但只是按照这里推荐的方式。 它来了:

 NSArray *navConArr = self.viewControllers;//self is custom UITabBarController UINavigationController *naviOne = [navConArr objectAtIndex:0];//I have 3 different tabs, objectAtIndex:0 means the first tab navigation controller UITabBarItem *naviBtn = naviOne.tabBarItem; UIImage *image = [[UIImage imageNamed:@"iconNaviOne"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [naviBtn setSelectedImage:image]; [naviBtn setImage:image]; 

因此,当从此选项卡移动到另一个选项卡并将其保留为未选中(默认为灰色)色调时,可以将其设置为提供的图像。 值得庆幸的是,这就像一个魅力(:

这是Swift 4解决方案:

 private var barButtonItem: UIBarButtonItem? override func viewDidLoad() { super.viewDidLoad() let barButtonItem = UIBarButtonItem(image: UIImage(named: "YourImage"), style: .plain, target: self, action: #selector(handleBarButtonAction)) navigationItem.rightBarButtonItem = barButtonItem self.barButtonItem = barButtonItem } @objc private func handleBarButtonAction() { if barButtonItem?.image == UIImage(named: "YourImage") { barButtonItem?.image = UIImage(named: "YourSelectedImage") } else { barButtonItem?.image = UIImage(named: "YourImage") } }