Создание подкласса UINavigationBar, как использовать его в UINavigationController?

Я хотел создать подкласс UINavigationBar (чтобы установить пользовательское фоновое изображение и цвет текста) и использовать его для всех панелей навигации в моем приложении. Глядя на документацию API для UINavigationController, похоже, что navigationBar доступен только для чтения:

@property (неатомный, только для чтения) UINavigationBar * navigationBar

Есть ли способ на самом деле использовать настраиваемый UINavigationBar в моих UIViewControllers? Я знаю, что в других приложениях есть настраиваемые панели навигации, например flickr:

http://img.skitch.com/20100520-bpxjaca11h5xne5yakjdc2m6xx.png

Вот мой подкласс UINavigationBar:

#import <UIKit/UIKit.h>

@interface MyNavigationBar : UINavigationBar <UINavigationBarDelegate> {

}

@end

реализация

#import "MyNavigationBar.h"

@implementation MyNavigationBar

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // override the standard background with our own custom one
    UIImage *image = [[UIImage imageNamed:@"navigation_bar_bgd.png"] retain];
    [image drawInRect:rect];
    [image release];
}

#pragma mark -
#pragma mark UINavigationDelegate Methods

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // use the title of the passed in view controller
    NSString *title = [viewController title];

    // create our own UILabel with custom color, text, etc
    UILabel *titleView = [[UILabel alloc] init];
    [titleView setFont:[UIFont boldSystemFontOfSize:18]];
    [titleView setTextColor:[UIColor blackColor]];
    titleView.text = title;
    titleView.backgroundColor = [UIColor clearColor];
    [titleView sizeToFit];

    viewController.navigationItem.titleView = titleView;
    [titleView release];

    viewController.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.1 green:0.2 blue:0.3 alpha:0.8];
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
}


- (void)dealloc {
    [super dealloc];
}

@end

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

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"navigation_bar_bgd.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

какие-либо предложения или другие решения? Я в основном хочу создать светлый фон и темный текст, как панели навигации приложения Flickr.


person funkadelic    schedule 20.05.2010    source источник


Ответы (3)


Я не знаю, понял ли ты это. Но для других, у которых может быть эта проблема ...

Что вам нужно сделать, так это указать класс в вашем XIB для вашего имени класса (в данном случае MyNavigationBar.

Проверьте сеанс 123 в WWDC 2011.

person Thiago Peres    schedule 23.09.2011

Задайте для свойства «оттенок» UINavigationBar нужный цвет.

person gnasher    schedule 21.05.2010
comment
Это сработает для изменения фона панели навигации, но я также хотел бы изменить белый цвет текста панели навигации по умолчанию, так как я хочу использовать светлый цвет фона. Например. если бы я хотел использовать белый фон, мне нужно было бы изменить белый текст по умолчанию на что-то темное - person funkadelic; 29.05.2010

Попробуйте создать [UIColor colorWithPatternImage:(UIImage*)image] и установить для него свойство backgroundColor NavBar. Еще не пробовал, но сделаю прямо сейчас.

person Romeo    schedule 21.05.2010