UIBarButtonItem с цветом?

Возможно ли иметь красный UIBarButtonItem?

11 ответов

Решение

Если кто-то ищет код для точного дублирования простого UIBarButtonItem:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal];
[button setTitle:@"Delete" forState:UIControlStateNormal];
button.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0f];
[button.layer setCornerRadius:4.0f];
[button.layer setMasksToBounds:YES];
[button.layer setBorderWidth:1.0f];
[button.layer setBorderColor: [[UIColor grayColor] CGColor]];
button.frame=CGRectMake(0.0, 100.0, 60.0, 30.0);
[button addTarget:self action:@selector(batchDelete) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem* deleteItem = [[UIBarButtonItem alloc] initWithCustomView:button];

И delete.png это:

delete.png

Почему не просто

[[self editButtonItem] setTintColor:[UIColor redColor]];

(на SDK 4.*, ios 5 и выше)

Вы можете создать пользовательский UIButton с вашим желаемым внешним видом и инициализировать UIBarButtonItem с ним как пользовательский вид.

UIButton *button = [UIButton buttonWithType:....];
...(customize your button)...

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];

Вы можете установить свойство tintColor для UIBarButtonItem в iOS 5. Если вам нужна поддержка iOS 4, ознакомьтесь с этим сообщением в блоге. Он детализируется с помощью UISegmentedControl, стилизованного под одну кнопку.

Использование пользовательского изображения не работает, так как для отображения кнопки используется альфа.

Хорошо, на самом деле, на мой взгляд, существует гораздо лучшее решение, которое включает в себя меньше кода и использует нативные элементы управления пользовательского интерфейса.

Хитрость заключается в том, чтобы использовать UISegmentedControl и удалить все сегменты, кроме одного. (Не может быть сделано в IB, должно быть сделано программно).

После этого вы устанавливаете цвет оттенка, а затем создаете UIBarButtonItem, передавая ему UISegmentedControl в качестве пользовательского представления.

Этот парень использовал эту технику, чтобы создать категорию UIBarButtonItem, которая прекрасно работает:

http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-uibarbuttonitem/

Вы можете создать собственное изображение для кнопки и использовать его. Иначе, если вы установили цвет tintColor панели навигации или панели инструментов на красный, элементы кнопок на них также будут отображаться красным цветом.

Если это UIBarButtonItem UIToolbar

установите это перед вашей реализацией в файле вы хотите этот код

@class UIToolbarTextButton;

Затем измените кнопки панели инструментов следующим образом:

   for (UIView *view in self.navigationController.toolbar.subviews) {
        NSLog(@"%@", [[view class] description]);
        if ([[[view class] description] isEqualToString:@"UIToolbarTextButton"]) {
            [(UIToolbarTextButton *)view setTintColor:yourcolor];
        }
    }   

Я хотел добавить что-то к выделенному решению. Если вы сделаете этот подкласс, он не будет выполнять сегментированные и расщепленные сегменты и селекторы, которые назначены UIBarButtonItem. Кроме того, свойства 'target' и 'action' не установлены в UIBarButtonItem, поэтому вы не можете получить к ним доступ из подкласса и назначить их вашей UIButton.

Я обошел это, добавив 2 свойства в мой подкласс (используя ARC):

@property (nonatomic, weak) id targetViewController;
@property (nonatomic, strong) NSString *segueIdentifier;

Затем, в инициализации вашего подкласса, добавьте что-то вроде этого к принятому коду ответа:

[button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside];

и функция:

- (void)performAction {
    if (_targetViewController && _segueIdentifier) {
        [_targetViewController performSegueWithIdentifier:_segueIdentifier sender:self];
    } else {
        NSLog(@"Requires targetViewController and segueIdentifier to be set");
    }
}

наконец, в вашем главном контроллере представления, который содержит все это, в 'viewDidLoad', добавьте это:

_fancyBarButtonItem.segueIdentifier = @"NewTransaction";
_fancyBarButtonItem.targetViewController = self;

Надеюсь, что это поможет кому-то еще сэкономить время, когда они пойдут по этому пути с раскадровками /iOS5

Если вы используете IB (Interface Builder), перетащите UIView из библиотеки на UIToolBarи это сгенерирует UIBarButtonItem с пользовательским видом. Затем вы можете добавить любые другие элементы управления, которые вы хотите, например, UIButton, UILabel, UIActivityIndicatorView,

Если у вас есть настройка UIBarButtonItem в раскадровке, вы должны установить tintColor в viewWillAppear() или же viewDidAppear() метод (положить его в viewDidLoad() не работает для меня...):

- (void)viewWillAppear {
    [super viewWillAppear];
    [[self editButtonItem] setTintColor:[UIColor redColor]];
}

Или в Свифте:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    editButtonItem.tintColor = UIColor.redColor()
}

Примечание: проверено на iOS 8/9.

Другие вопросы по тегам