Как установить 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