【发布时间】:2011-11-25 10:33:43
【问题描述】:
点击“记录”BarButtonItem 后,我想以编程方式将其保持突出显示,直到记录结束。 iOS的高亮图形非常好,所以我想保持或设置那个状态。
到目前为止,我发现了“setSelected”和“setHighlighted”,但它们在 UIBarButtonItem 上不起作用。 关于如何解决这个问题的任何建议?提前谢谢你,Koen。
【问题讨论】:
标签: ios cocoa uibarbuttonitem
点击“记录”BarButtonItem 后,我想以编程方式将其保持突出显示,直到记录结束。 iOS的高亮图形非常好,所以我想保持或设置那个状态。
到目前为止,我发现了“setSelected”和“setHighlighted”,但它们在 UIBarButtonItem 上不起作用。 关于如何解决这个问题的任何建议?提前谢谢你,Koen。
【问题讨论】:
标签: ios cocoa uibarbuttonitem
setSelected 和 setHighlighted 在 UIControls 上运行良好,但在 UIBarButtonItems(不是 UIControls)上运行良好。
我建议使用 UIBarButtonItem 的 - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics(文档链接)方法将背景图像更改为模仿突出显示的内容。
您还可以在项目上设置自定义 UIView,它也模仿突出显示(请参阅customView 属性)。
【讨论】:
如果你绝对想使用默认图形,你可以将你的按钮项初始化为
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];
【讨论】:
您创建此按钮的插座,例如 btnMoreOut,然后您这样做:
btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1];
我希望这会有所帮助..祝你好运:)
【讨论】:
1) 获取对您的栏按钮的引用。
2) 使用 style 属性,将它分配给 UIBarButtonItemStyleDone,或基于某种状态的 UIBarButtonItemStylePlain。
注意。您可以通过各种方式获取状态。例如,使用 NSUserDefaults,在那里保存一个键值对。提取值,并获取一些 BOOL 表示进行测试。然后写下这一行:
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;
}
【讨论】:
p.a.'s answer,已转换为 Xcode 9、Swift 4。
这个想法是 .done 样式突出显示 - 或 bolds,在 Swift 4 中 - 按钮文本。
将按钮项初始化为未高亮状态:
let toggleButtonItem = UIBarButtonItem(title: "MyButton",
style: .plain,
target: self,
action: #selector(doSomething))
使用三元运算符将按钮项切换到突出显示状态,如下所示:
toggleButtonItem.style = (toggleButtonItem.style == .plain) ?
toggleButtonItem.style = .done : toggleButtonItem.style = .plain
或者,或者,使用像这样的常规 if/else 语句来切换高亮状态:
if toggleButtonItem.style == .plain {
toggleButtonItem.style = .done
}
else {
toggleButtonItem.style = .plain
}
并且,设置一个布尔值来检查按钮项是否被突出显示:
var isHighlighted: Bool = (toggleButtonItem.style == .done)
注意事项:
bordered 样式在 iOS 8 中已被弃用,所以我在这里改用了.plain。它们都以未突出显示的状态显示按钮项的文本。 #selector 函数必须是 @IBAction,或者必须以 @objc 为前缀,以避免“Objective-C 推理”问题。例如:
@objc func doSomething() { ... }
或者,如果您已将操作连接到按钮项:
@IBAction func doSomething() { ... }
这两个函数声明都告诉编译器它们正在使用基于 Objective-C 的功能。这是必需的,因为 #selector 在底层是 Objective-C 的东西,在 Swift 4 中你必须声明这一点,而不是让编译器推断像以前那样。
【讨论】:
你可以试试这个(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: 更稳定(在展开 segue 推送动画期间更改色调颜色中断)。
【讨论】:
您可以将两个图像用于按钮的两种状态,例如对于一个状态“UIControlStateNormal”,您可以将图像用于正常状态。
然后当按钮被按下时,设置另一个显示它被按下的图像,然后使用 UIButton 的 isSelected 方法检查图像。
希望这对你有意义。
【讨论】: