Как я могу использовать разные категории для UIToolbar? - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть несколько UIToolbars по всему моему приложению.Я хочу, чтобы у каждого был свой фон.Вот пример моей категории:

#import "UIToolbar+NavBarAdditions.h"


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

У меня есть несколько изображений rowbg1, rowbg2 и т. Д., Которые я хочу использовать для других панелей UIToolbar, которые находятся внутри моего приложения.Как выбрать категорию для соответствующей панели инструментов?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

Изменение фона панели инструментов

Использование подкласса

Категория изменяет все классы UIToolbar.Если вам нужны разные панели инструментов, пусть каждый клиент будет отвечать за настройку изображения:

@interface UIBgToolbar : UIToolbar {
@private
    UIImage *_background;
}
@end
@implementation UIBgToolbar
- (id)initWithFrame:(CGRect)aRect imagen:(UIImage*)image {
    if (self = [super initWithFrame:aRect]){
        _background = [image retain];
    }
    return self;
}
- (void) drawRect:(CGRect)rect {
    UIImage *barImage = _background;
    [barImage drawInRect:rect];
}
-(void)dealloc {
    [_background release];
    [super dealloc];
}
@end

Использование:

UIImage *bg = [UIImage imageNamed:@"bar_bottom.png"];
// 416 = 480 - status bar (20) - navigation bar (44)
CGRect rect = CGRectMake(0, 416-bg.size.height, bg.size.width, bg.size.height);
UIBgToolbar *toolbar = [[UIBgToolbar alloc] initWithFrame:rect imagen:bg];
[self.view addSubview:toolbar];
[toolbar release];

Использование подпредставления

Это альтернативаспособ, который добавляет подпредставление и не требует подклассов или категорий:

UIImage *bg = [UIImage imageNamed:@"bar_bottom.png"];
// 416 = 480 - status bar (20) - navigation bar (44)
CGRect rect = CGRectMake(0, 416-bg.size.height, bg.size.width, bg.size.height);
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:rect];

UIImageView *background = [[[UIImageView alloc] initWithImage:bg] autorelease];
background.frame = toolbar.bounds;
background.autoresizingMask = UIViewAutoresizingFlexibleWidth;
BOOL isIOS5 = [[[UIDevice currentDevice] systemVersion] intValue] >= 5;
toolbar insertSubview:background atIndex: (isIOS5 ? 1 : 0)];

[self.view addSubview:toolbar];
[toolbar release];

Создание фона прозрачным.

Не используйте это, если вам действительно не нужен прозрачный фон.

@interface UITransparentToolBar : UIToolbar
@end
@implementation UITransparentToolBar
- (void)drawRect:(CGRect)rect {
    [[UIColor clearColor] set];
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
}
@end

Использование:

// create the toolbar
UIImage *bg = [UIImage imageNamed:@"bar_bottom.png"];
// 416 = 480 - status bar (20) - navigation bar (44)
CGRect rect = CGRectMake(0, 416-bg.size.height, bg.size.width, bg.size.height);
UIBgToolbar *toolbar = [[UIBgToolbar alloc] initWithFrame:rect];

// add the background
// self.backgroundColor = [UIColor clearColor];
UIImageView *background = [[UIImageView alloc] initWithImage:bg];
background.frame = toolbar.bounds;
background.autoresizingMask = UIViewAutoresizingFlexibleWidth;
BOOL isIOS5 = [[[UIDevice currentDevice] systemVersion] intValue] >= 5;
[toolbar insertSubview:background atIndex: (isIOS5 ? 1 : 0)];

[self.view addSubview:toolbar];
[toolbar release];

Изменение панели навигации

Фон панели навигации

Использование кода Ноя в категории.

Использованиетакже возможен подкласс:

  • Создайте подкласс UINavigationToolbar, содержащий метод drawRect из ответа Ноя.- Выберите свой MainWindow.XIB, выберите «Панель навигации», нажмите to3, чтобы (показать Identity Inspector), и измените класс на класс, который вы только что создали.
  • Также в IB нажмите ⌥⌘4(показать Attributes Inspector) и установить число в поле Tag.Если вы посмотрите на код Ноя, это число решает, какое изображение использовать.

Фон панели инструментов панели навигации

То же самое, что и для обычной панели инструментов, но с использованием категории, потому что панель инструментов навигации являетсятолько для чтения:

// UIToolbar.h
@interface UIToolbar (Transparency)
- (void)drawRect:(CGRect)rect;
@end
// UIToolbar.m
#import "TransparentToolbar.h"
@implementation UIToolbar (Transparency)
- (void)drawRect:(CGRect)rect {
    [[UIColor clearColor] set];
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
}
@end

Использование:

// bar_bottom_bumped.png is a toolbar image with transparency
UIImage *bg = [UIImage imageNamed:@"bar_bottom_bumped.png"];
UIImageView *background = [[UIImageView alloc] initWithImage:bg];
background.frame = self.navigationController.toolbar.bounds;
background.autoresizingMask = UIViewAutoresizingFlexibleWidth;
BOOL isIOS5 = [[[UIDevice currentDevice] systemVersion] intValue] >= 5;
self.navigationController.toolbar.backgroundColor = [UIColor clearColor];
[self.navigationController.toolbar insertSubview:background atIndex: (isIOS5 ? 1 : 0)];
2 голосов
/ 01 сентября 2011

Если вы создаете панели инструментов самостоятельно - в IB или с помощью кода - тогда решение Jano в основном правильное, хотя я не согласен с идеей сделать его прозрачным: вам следует избегать ненужного смешивания. Если вам необходимо заменить панели инструментов, созданные навигационным контроллером, вам нужно использовать категорию, а не подклассы. Вы можете использовать вашу существующую реализацию; вам просто нужно установить разные tag на каждой из панелей инструментов, которые вы хотите иметь разный вид, а затем проверить это значение в вашем -drawRect:. Другими словами, ваш контроллер представления должен иметь что-то вроде этого:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIToolbar *toolbar = self.navigationController.toolbar;
    toolbar.tag = 3; // different value for each controller, or however you want to choose the toolbar
    [toolbar setNeedsDisplay];
}

и ваша категория панели инструментов должна выглядеть примерно так:

- (void)drawRect:(CGRect)r
{
    UIImage *barImage = nil;
    switch(self.tag)
    {
        case 1:
            barImage = [UIImage imageNamed:@"rowbg.png"];
            break;
        case 3:
            barImage = [UIImage imageNamed:@"something else.png"];
            break;
    }

    [barImage drawInRect:self.bounds];
}
1 голос
/ 01 сентября 2011

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

...