Несколько пользовательских фонов для UIToolbar

Чтобы создать нижний колонтитул с абсолютным нижним колонтитулом поверх tableView, я обнаружил, что использование UIToolbar для этого и добавление пользовательских представлений для него работает нормально.

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

Заменив функцию drawRect в UIToolbar + add.m, у меня есть глобальная панель инструментов для этого, которая отлично работает в моих веб-просмотрах.

Как я могу расширить это, чтобы я мог выбрать, какую версию (фон) использовать в разных местах?

Мой UIToolbar + add.m:

#import "UINavigationBar+addition.h"

@implementation UIToolbar (Addition)
- (void) drawRect:(CGRect)rect {
    UIImage *barImage = [UIImage imageNamed:@"toolbar-bg.png"];
    [barImage drawInRect:rect];
}
@end

person doh    schedule 22.02.2011    source источник


Ответы (2)


Попробуйте создать отдельные файлы .h и .m для каждой «версии» и импортируйте соответствующий .h в файл класса, на который вы хотите повлиять.

person Aaron Ash    schedule 10.12.2011

Почему бы просто не добавить в расширение свойство barImage?

@interface UIToolbar (Addition)

@property (nonatomic, retain) UIImage *barImage;

@end

Затем в вашей реализации (я делаю это, предполагая, что вы не используете ARC. Если да, очевидно, удалите материал для сохранения / освобождения):

@implementation UIToolbar (Addition)

@synthesize barImage = _barImage;

//Override barImage setter to force redraw if property set after already added to superView...
- (void)setBarImage:(UIImage *)barImage {
    if (_barImage != barImage) {
        UIImage *oldBarImage = [_barImage retain];
        _barImage = [barImage retain];
        [oldBarImage release];

        //Let this UIToolbar instance know it needs to be redrawn in case you set/change the barImage property after already added to a superView...
        [self setNeedsDisplay];
    }
}    

- (void) drawRect:(CGRect)rect {
    [self.barImage drawInRect:rect];
}

//If you're not using ARC...
- (void)dealloc {
    [barImage release];
    [super dealloc];
}

@end

Теперь все, что вам нужно сделать, это установить свойство barImage после создания вашего UIToobar. например.:

UIToolBar *myToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; //Or whatever frame you want...
myToolbar.barImage = [UIImage imageNamed:@"toolbar-bg.png"];
[self.view addSubView:myToolbar];
[myToolbar release];

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

Похоже, прошел год с тех пор, как этот вопрос был опубликован, но, надеюсь, это может кому-то помочь.

person Ashwin    schedule 01.03.2012