【问题标题】:how to set UIBarButtonItem selected or highlighted image or tint colours in iOS 7?如何在 iOS 7 中设置 UIBarButtonItem 选定或突出显示的图像或色调颜色?
【发布时间】:2013-10-19 16:38:48
【问题描述】:

如何在 iOS 7 中向 uibarbuttonitem 提供正常状态和选中/高亮状态图像?有什么方法可以为 uibarbuttonitem 的正常状态和选定/突出显示状态提供色调颜色?

我不想使用 uibutton 作为 uibarbuttonitem 的视图!任何优雅的解决方案都将受到高度赞赏。

【问题讨论】:

  • 我也想知道是否有办法做到这一点。使用 UIButton 的自定义视图是我所知道的最接近的解决方案,但它无法处理不同的条形指标。
  • 没错。对于这种期望的行为,我从来没有遇到过任何可能的解决方案。
  • 在iOS 10之前,UINavigationBar中UIBarButtonItem的视图类为UINavigationButton,在iOS 11之后为_UIButtonBarButton。它们都是UIControl的子类,所以你可以swizzle UIControlsetHighlighted:setSelected:,添加一个类似setHighlightedBlocksetSelectedBlock的属性,调用swillze方法中的块,然后你可以做得到UIBarButtonItem的视图后你想要的任何东西。

标签: ios ios7 uibarbuttonitem


【解决方案1】:

斯威夫特 5.x

guard let button = self?.navigationItem.rightBarButtonItem?.customView as? UIButton  else { return }
// button.isSelected = #your condition here
// button.tintColor = #your condition here

【讨论】:

    【解决方案2】:

    AFAIK 没有本地/优雅的解决方案可以做到这一点,我所做的是跟踪按钮的状态并基于此更改 tintColor

    @objc func handleButton() {
        if yourButtonIsSelected {
            yourButton.tintColor = unselectedColor
        } else {
            yourButton.tintColor = selectedColor
        }
    }
    

    请注意,无法知道是否选择了 UIBarButtonItem,因此您也需要提供此信息(在我的示例中为 yourButtonIsSelected

    【讨论】:

      【解决方案3】:

      这里是Swift 4解决方案:

      private var barButtonItem: UIBarButtonItem?
      
      override func viewDidLoad() {
          super.viewDidLoad()
          let barButtonItem = UIBarButtonItem(image: UIImage(named: "YourImage"), style: .plain, target: self, action: #selector(handleBarButtonAction))
          navigationItem.rightBarButtonItem = barButtonItem
          self.barButtonItem = barButtonItem
      }
      
      @objc
      private func handleBarButtonAction() {
          if barButtonItem?.image == UIImage(named: "YourImage") {
              barButtonItem?.image = UIImage(named: "YourSelectedImage")
          } else {
              barButtonItem?.image = UIImage(named: "YourImage")
          }
      }
      

      【讨论】:

        【解决方案4】:

        根据this answer,我做了一些额外的事情,并且在这里为您提供了答案。我有我的自定义 UITabBarController,它在 StoryBoard 文件中与我的 UITabBarController 链接。因此,为了在未选择 TabBar 时移除 iOS 提供的自动色调,我最终以这种方式将其移除。图像可以是各种各样的图像,但只是以recommended here 的方式。就是这样:

        NSArray *navConArr = self.viewControllers;//self is custom UITabBarController
        UINavigationController *naviOne = [navConArr objectAtIndex:0];//I have 3 different tabs, objectAtIndex:0 means the first tab navigation controller
        UITabBarItem *naviBtn  = naviOne.tabBarItem;
        UIImage *image = [[UIImage imageNamed:@"iconNaviOne"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        [naviBtn setSelectedImage:image];
        [naviBtn setImage:image];
        

        因此,当从该选项卡移动到另一个选项卡并将其保留为未选择(默认为灰色)色调时,您可以将其设置为提供的图像。谢天谢地,这就像一个魅力(:

        【讨论】:

          【解决方案5】:

          您可以将UIButton 用作UIBarButtonItemcustomView,并为UIButton 的normalselected 状态设置两个不同的背景图像。然后当点击按钮时,您可以将selected 状态设置为YESNO

          // Build right bar button
          UIImage *normalButtonImage = [UIImage imageNamed:@"normal-button"];
          UIImage *selectedButtonImage = [UIImage imageNamed:@"selected-button"];
          CGRect rightButtonFrame = CGRectMake(0, 0, normalButtonImage.size.width,
                                                     normalButtonImage.size.height);
          UIButton *rightButton = [[UIButton alloc] initWithFrame:rightButtonFrame];
          [rightButton setBackgroundImage:normalButtonImage forState:UIControlStateNormal];
          [rightButton setBackgroundImage:selectedButtonImage forState:UIControlStateSelected];
          [rightButton addTarget:self action:@selector(rightBarButtonPress)
                   forControlEvents:UIControlEventTouchDown];
          [orientationButton setShowsTouchWhenHighlighted:YES];
          [orientationButton setSelected:NO];
          UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
          [self.navigationItem setRightBarButtonItem:rightBarButton];
          

          然后你的in方法当按钮被点击时,改变状态

          - (void)rightBarButtonPress
          {
              //toggle selected state of button
              UIBarButtonItem *rightBarButton = self.navigationItem.rightBarButtonItem;
              UIButton *button = (UIButton *)rightBarButton.customView;
              [button setSelected:!button.selected];
          
              //do whatever else you gotta do
          }
          

          【讨论】:

            【解决方案6】:

            您可以使用UIAppearance Protocol Reference 来完成此操作

            NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, [UIColor clearColor], UITextAttributeTextShadowColor, nil];
            
            [[UIBarButtonItem appearance] setTitleTextAttributes:options forState:UIControlStateNormal];
            

            您可能还必须使用:

            [[UINavigationBar appearance] setTintColor:[UIColor redColor]];
            

            【讨论】:

            • 其实UINavigationBar中的tintColor属性并不是UI_APPEARANCE_SELECTOR,即使代码[[UINavigationBar appearance] setTintColor:[UIColor redColor]]工作正常。所以我建议不要使用 tintColor 和UIAppearance
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-13
            • 1970-01-01
            • 2016-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-07
            相关资源
            最近更新 更多