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

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

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

Ответ 1

Вы можете использовать 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
}

Ответ 2

Вы можете сделать это, используя Справка протокола UIAppearance

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, [UIColor clearColor], UITextAttributeTextShadowColor, nil];

[[UIBarButtonItem appearance] setTitleTextAttributes:options forState:UIControlStateNormal];

Вам также может потребоваться использовать:

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

Ответ 3

В соответствии с этим ответом, я сделал что-то дополнительное и вроде бы для вас ответ. У меня есть свой пользовательский 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];

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