2009-03-20 3 views

ответ

62

Если кто-то ищет код, чтобы точно дублировать простой 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

+8

Еще одно примечание: вам нужно добавить библиотеку QuartzCore в свой проект и импортировать его в свой класс для использования методов CALayer. – Johanisma

+6

Чтобы сохранить других, нужно посмотреть: #import

+2

Я думаю, что угловой радиус по умолчанию может быть 5.0f вместо 4.0f. Кроме того, люди могут также предпочесть использовать изображение шириной 1 пиксель, чтобы уменьшить изображение. Этот пост был полезен, хотя, спасибо! –

1

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

3

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

26

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

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

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

Но это не дает вам UIBarButtonItem, который соответствует рендерингу по умолчанию для iOS, если только вы не захотите тщательно воспроизвести поведение рендеринга по умолчанию для iOS, как это делает Скотт. Если, однако, вы хотите уйти от просмотра по умолчанию, то это, безусловно, путь. – charshep

0

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

1

Если сво 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]; 
     } 
    } 
2

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

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

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

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

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

+0

Отличное предложение, если вам нужно поддерживать 4.3, как я. Я перейду к категории, указанной в ссылке. –

7

Вы можете установить свойство tintColor в виде UIBarButtonItem в прошивкой 5. Если вам нужна поддержка IOS 4, проверка вне this blog post. Он детализирует использование UISegmentedControl в стиле, напоминающем одну кнопку.

0

Я хотел добавить что-то к выделенному решению. Если вы выполните это подклассирование, он не будет выполнять разбитые на раскадровные последовательности и селектора, назначенные для 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

36

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

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

(на 4 * SDK, ИОС 5 и выше)

+0

прохладный. Это потрясающе. – Viraj

+0

Спасибо. его очень легко – iMeMyself

+0

Просто, что было необходимо. Благодарю. – jkcl

0

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

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

Или в Swift:

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

Примечание: испытания на iOS 8/9.