Если вы ориентируетесь только на iOS 5.0, вы можете изменить внешний вид по умолчанию с помощью новых методов UIAppearance
, в частности -setBackButtonBackgroundImage:forState:barMetrics:
.
Если вам требуется поддержка более старых версий iOS, вы должны создать подкласс UIBarButtonItem
, добавить переменную экземпляра UIButton
, создать ее и вызвать –initWithCustomView:
в методе init
вашего UIBarButtonItem
. Это потому, что UIBarButtonItem
не является подклассом UIView
, и вы не можете рисовать в нем свои собственные изображения. Вам также следует установить свойство width
вашего UIBarButtonItem
вручную.
@interface MYCustomBarButtonItem : UIBarButtonItem
{
UIButton *button;
}
- (id)initWithTitle:(NSString *)title; // name it in concordance with your needs
@end
#define kButtonHeight 30
#define kButtonTitleFontSize 12
#define kButtonTitlePadding 5
@implementation MYCustomBarButtonItem
- (id)initWithTitle:(NSString *)title
{
button = [UIButton buttonWithType:UIButtonTypeCustom]; // add retain here, and write the dealloc method if you aren't using ARC. Also, release it if self == nil.
self = [super initWithCustomView:button];
if (self) {
UIFont *titleFont = [UIFont boldSystemFontOfSize:kButtonTitleFontSize];
CGSize titleSize = [title sizeWithFont:titleFont];
CGFloat buttonWidth = titleSize.width + kButtonTitlePadding * 2;
button.frame = CGRectMake(0, 0, buttonWidth, kButtonHeight);
self.width = buttonWidth;
[button setTitle:title forState:UIControlStateNormal];
// Set your styles
button.titleLabel.font = titleFont;
// Normal state background
UIImage *backgroundImage = ...; // create your normal stretchable background image
[button setBackgroundImage:backgroundImage forState:UIControlStateNormal];
// Pressed state background
backgroundImage = ...; // create your pressed stretchable background image
[button setBackgroundImage:backgroundImage forState:UIControlStateHighlighted];
// and so on...
}
return self;
}
@end
PS. Не забудьте переопределить свойства target
и action
вашего подкласса для работы с вашим экземпляром button
.