以编程方式突出显示UIBarButtonItem

点击“logging”BarButtonItem后,我想保持它以编程方式突出显示,直到录制结束。 iOS的突出显示graphics非常好,因此我想保留或设置该状态。

到目前为止,我发现“setSelected”和“setHighlighted”,但这些不能在UIBarButtonItem上工作。 有关如何解决这个问题的任何build议? 先谢谢你,Koen。

setSelectedsetHighlighted在UIControls上setHighlighted工作,但不是UIBarButtonItems(它们不是UIControls)。

我推荐使用UIBarButtonItem的- (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics (文档链接)方法将背景图像更改为模仿突出显示。

你也可以在模仿突出显示的项目上设置一个自定义UIView(请参阅customView属性)。

如果你绝对想使用默认的graphics,你可以初始化你的button项目

 UIBarButtonItem *toggleButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyButton" style:UIBarButtonItemStyleBordered target:someObject action:@selector(doSomething:)]; 

并切换它

 toggleButtonItem.style = (toggleButtonItem.style == UIBarButtonItemStyleBordered) ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered; 

您还需要使用style属性来读取当前状态。

 BOOL isSelected = (toggleButtonItem.style == UIBarButtonItemStyleDone) 

如果你添加一个UIBarButtonItemUIButton支持,你可以问一下CustomView。

与支持UIButton的UIBarButtonItem

 UIButton *button = (UIButton *)[self.barButtonItem customView]; [button setSelected:YES]; 

你创build这个button的出口,例如btnMoreOut ,你做:

 btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1]; 

我希望这有助于…祝你好运:)

1)获取你的酒吧button的参考。

2)使用style属性,根据某些状态将其分配给UIBarButtonItemStyleDone或UIBarButtonItemStylePlain。

NB。 你可以通过各种方式获得状态。 例如,使用NSUserDefaults,在那里保存一个键值对。 拉出值,并抓住一些BOOL表示来testing。 然后写下这一行:

  self.myButton.style = self.someState ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

或者像这样嵌套默认值:

 self.myButton.style = [[NSUserDefaults standardUserDefaults] boolForKey:@"someKey"] ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

没有三元运算符:

 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"someKey"]) { self.myButton.style = UIBarButtonItemStyleDone; } else { self.myButton.style = UIBarButtonItemStylePlain; } 

你可以试试这个(Swift):

  func setupInterface(){ var myButton = UIBarButtonItem() if (your_condition){ myButton = UIBarButtonItem(image: UIImage(named: "img_selected"), style: .Plain, target: self, action: Selector("DoSomething:")) } else{ myButton = UIBarButtonItem(image: UIImage(named: "img_unselected"), style: .Plain, target: self, action: Selector("DoSomething:")) } navigationItem.rightBarButtonItem = myButton } 

在ViewDidLoad中调用setupInterface(),并在代码中调用另一个函数。

如果要更改标题属性(例如标题颜色),可以调用setTitleTextAttributes:forState:

对我来说,它比setTintColor:更稳定setTintColor:在展开渐变推动animation期间改变着色颜色中断)。

pa的答案 ,转换为Xcode 9,Swift 4。
这个想法是.done风格在Swift 4中突出显示了 – 或者粗体 – button文本。

以未加亮的状态初始化button项目:

 let toggleButtonItem = UIBarButtonItem(title: "MyButton", style: .plain, target: self, action: #selector(doSomething)) 

使用三元运算符将button项目切换为突出显示的状态,如下所示:

 toggleButtonItem.style = (toggleButtonItem.style == .plain) ? toggleButtonItem.style = .done : toggleButtonItem.style = .plain 

或者,也可以使用像这样的常规if/else语句切换突出显示状态:

 if toggleButtonItem.style == .plain { toggleButtonItem.style = .done } else { toggleButtonItem.style = .plain } 

而且,要设置一个布尔值来检查button项是否突出显示:

 var isHighlighted: Bool = (toggleButtonItem.style == .done) 

笔记:

  • bordered样式在iOS 8中已弃用,所以我在这里使用了。 它们都将button项目的文本呈现为不亮的状态。
  • #selector函数必须是@IBAction ,或者必须以@objc为前缀,以避免“Objective-C推理”问题。 例如:

     @objc func doSomething() { ... } 

    或者,如果您已将操作连接到button项目:

     @IBAction func doSomething() { ... } 

    这两个函数声明都告诉编译器他们正在使用基于Objective-C的function。 这是必需的,因为#selector是一个Objective-C的东西,在Swift 4中,你必须声明这一点,而不是让编译器推断之前做的事情。

您可以使用两个图像作为button的两种状态,例如“UIControlStateNormal”状态,您可以使用正常情况下的图像。

然后当按下button时,设置显示的其他图像,然后使用UIButton的isSelected方法检查图像。

希望这对你有意义。