【问题标题】:programmatically highlight UIBarButtonItem以编程方式突出显示 UIBarButtonItem
【发布时间】:2011-11-25 10:33:43
【问题描述】:

点击“记录”BarButtonItem 后,我想以编程方式将其保持突出显示,直到记录结束。 iOS的高亮图形非常好,所以我想保持或设置那个状态。

到目前为止,我发现了“setSelected”和“setHighlighted”,但它们在 UIBarButtonItem 上不起作用。 关于如何解决这个问题的任何建议?提前谢谢你,Koen。

【问题讨论】:

    标签: ios cocoa uibarbuttonitem


    【解决方案1】:

    setSelectedsetHighlighted 在 UIControls 上运行良好,但在 UIBarButtonItems(不是 UIControls)上运行良好。

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

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

    【讨论】:

    • 嗨迈克尔,你有一些关于在 UIBarButtonItem 中使用 customView 的示例代码吗?我已经尝试实现它,但以一个黑色矩形结束,我希望它透明。有什么建议吗?
    • 我已经通过使用 UIImageView 作为 customView 解决了这个问题。将 userInteractionEnabled 设置为 TRUE。
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 唉,Bordered 已弃用。
    【解决方案3】:

    如果您添加 UIBarButtonItemUIButton 支持它,您只需请求 CustomView。

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

    【讨论】:

    • 这个答案很好用,唯一的问题是你需要转换 [self.barButtonItem customView];到 UIButton。 (UIButton *)self.barButtonItem.customView;否则效果很好。
    • 是的,演员阵容是必要的,但并不严重。您是否对此答案投了反对票?只需编辑它。
    • 我投了赞成票。不知道反对票的来源。
    【解决方案4】:

    您创建此按钮的插座,例如 btnMoreOut,然后您这样做:

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

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

    【讨论】:

    • 太棒了。非常适合我的实施! :)
    【解决方案5】:

    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;
    }
    

    【讨论】:

    • 我已经厌倦了要求人们添加解释,并且没有“仅代码”选项而有“仅链接”选项。请添加说明!
    • @Mark 好的,如果这对您来说足够的上下文,请告诉我。现在有意义吗?我正在使用可能会抛出你的三元运算符。
    • 谢谢@cocoanut,这好多了。
    【解决方案6】:

    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 中你必须声明这一点,而不是让编译器推断像以前那样。

    【讨论】:

      【解决方案7】:

      你可以试试这个(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() 并在您的代码中调用另一个函数。

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

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

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

          希望这对你有意义。

          【讨论】:

          • -1 问题确认 isSelected 方法在 UIButton 上可用,但它特别要求 UIBarButtonItem 上的等效方法。
          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          相关资源
          最近更新 更多