Изменение готового фонового изображения UIBarButtonItem - PullRequest
1 голос
/ 19 января 2012

Я хочу создать пользовательский элемент UIBarButtonItem для представления кнопки «Готово». Я хочу иметь возможность интернационализировать приложение, поэтому я хочу, чтобы текст был непосредственно редактируемым. Чтобы учесть различную длину метки «Готово», я разработал растягиваемое изображение. Можно ли напрямую изменить фон кнопки редактирования по умолчанию или нужен пользовательский UIBarButtonItem? Если это так, какой будет способ динамического изменения размера фона stretchableImage в соответствии с длиной метки?

Ответы [ 2 ]

7 голосов
/ 19 января 2012

Если вы ориентируетесь только на 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.

2 голосов
/ 19 января 2012

Возможно, я неправильно понял ваш вопрос, но я верю, что все, что вам нужно, это:

UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithTitle:@"I am done" style:UIBarButtonItemStyleBordered target:self action:nil];
UIImage *stretchable = [[UIImage imageNamed:@"StretchableImage.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:16];
[btnDone setBackgroundImage:stretchable forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.navigationItem setRightBarButtonItem:btnDone];

UIBarButtonItem автоматически подстраивает свою ширину к ширине метки.

...