以编程方式突出显示UIBarButtonItem
点击“logging”BarButtonItem后,我想保持它以编程方式突出显示,直到录制结束。 iOS的突出显示graphics非常好,因此我想保留或设置该状态。
到目前为止,我发现“setSelected”和“setHighlighted”,但这些不能在UIBarButtonItem上工作。 有关如何解决这个问题的任何build议? 先谢谢你,Koen。
setSelected
和setHighlighted
在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)
如果你添加一个UIBarButtonItem
和UIButton
支持,你可以问一下CustomView。
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方法检查图像。
希望这对你有意义。