以编程方式突出显示UIBarButtonItem

时间:2011-11-25 10:33:43

标签: ios cocoa uibarbuttonitem

点击“记录”背后的

BarButtonItem我想以编程方式突出显示,直到录制结束。 iOS的突出显示图形非常好,因此我想保留或设置该状态。

到目前为止,我发现了' setSelected'和' setHighlighted'但这些不适用于UIBarButtonItem。 关于如何解决这个问题的任何建议?提前谢谢你,Koen。

9 个答案:

答案 0 :(得分:9)

setSelectedsetHighlighted可以在UIControl上正常工作,但不能在UIBarButtonItems(不是UIControls)上工作。

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

您还可以在项目上设置自定义UIView,该项目也模仿突出显示(请参阅customView属性)。

答案 1 :(得分:6)

如果您添加UIBarButtonItem UIButton支持它,您可以直接询问CustomView。

UIBarButtonItem with a backing UIButton

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

答案 2 :(得分:5)

如果您绝对想要使用默认图形,可以将按钮项初始化为

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)

答案 3 :(得分:4)

您可以创建此按钮的插座,例如btnMoreOut,然后执行以下操作:

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

我希望这会有所帮助。祝你好运:)。

答案 4 :(得分:2)

1)获取对条形按钮的引用。

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

NB。你可以通过各种方式获得国家。例如,使用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;
}

答案 5 :(得分:1)

p.a.'s answer,转换为Xcode 9,Swift 4.
我们的想法是,在Swift 4中,.done样式突出显示 - 或粗体 - 按钮文字。

以非突出显示状态初始化按钮项目:

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)

注意:

  • 在iOS 8中已弃用bordered样式,因此我在此处使用了.plain。它们都以未突出显示状态显示按钮项目的文本。
  • #selector函数必须是@IBAction,或者必须以@objc为前缀,以避免“Objective-C推理”问题。例如:

    @objc func doSomething() { ... }
    

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

    @IBAction func doSomething() { ... }
    

    这两个函数声明都告诉编译器他们正在使用基于Objective-C的功能。这是必需的,因为#selector是一个幕后的Objective-C,在Swift 4中你必须说明这一点,而不是让编译器推断正如以前所做的那样

答案 6 :(得分:0)

你可以试试这个(斯威夫特):

    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(),在代码中调用另一个函数。

答案 7 :(得分:0)

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

对我来说,它比setTintColor:更稳定(在展开segue推动动画期间更改色调颜色中断)。

答案 8 :(得分:-2)

您可以将两个图像用于按钮的两种状态,例如一个状态“UIControlStateNormal”,您可以将图像用于正常状态。

然后按下按钮时,设置显示按下按钮的另一个图像,然后使用UIButton的isSelected方法检查图像。

希望这对你有意义。