Как установить UIBarButtonItem выбранное или подсвеченное изображение или цвета оттенка в iOS 7?

Как обеспечить нормальное состояние и выбранные / выделенные состояния изображения для uibarbuttonitem в iOS 7? Есть ли способ обеспечить оттенок цвета как для нормального, так и для выделенного / выделенного состояния uibarbuttonitem?

Я не хочу использовать uibutton как представление для uibarbuttonitem! Любое элегантное решение будет высоко оценено.

6 ответов

Вы можете использовать UIButton как customView из UIBarButtonItem и иметь два разных фоновых изображения для normal а также selected состояние UIButton. Затем, когда кнопка нажата, вы можете просто установить selected государство для YES или же NO,

// 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];

Затем ваш метод, когда кнопка нажата, изменить состояние

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

Вы можете сделать это с помощью 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]];

В соответствии с этим ответом, я сделал что-то дополнительное и вроде как ответ для вас здесь. У меня есть свой пользовательский UITabBarController, который связан с моим UITabBarController в файле StoryBoard. Таким образом, чтобы удалить автоматический оттенок, предоставляемый iOS, когда TabBar не выбран, я в итоге удалил его таким образом. Изображения могут быть самыми разными, но только так, как рекомендуется здесь. Здесь это идет:

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

Поэтому, когда вы переходите с этой вкладки на другую и оставляете ее в невыбранном оттенке (серый по умолчанию), вы можете установить для него указанное изображение. К счастью, это работает как шарм (:

Вот 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")
    }
}

AFAIK нет собственного / элегантного решения для этого, то, что я сделал, отслеживает состояние кнопки и на основе этого меняет tintColor

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

Обратите внимание, что нет способа узнать, есть ли UIBarButtonItem выбрано или нет, вам также нужно будет указать это ( yourButtonIsSelected на моем примере)

Свифт 5.х

      guard let button = self?.navigationItem.rightBarButtonItem?.customView as? UIButton  else { return }
// button.isSelected = #your condition here
// button.tintColor = #your condition here
Другие вопросы по тегам