Изменить панель навигации Фоновое изображение при каждой навигации - PullRequest
6 голосов
/ 14 июля 2011

Я работаю над приложением для iPhone.Я добавил панель навигации Фоновое изображение

С интерфейсом: -

@interface UINavigationBar (backgroundImageWithTitle)

И метод: -

- (void)drawRect:(CGRect)rect

Этим методом фоновые изображения панели навигации устанавливаются один раз.

Я хочу вызывать его из разных файлов .m для назначения разных изображений на панели.

Как это можно реализовать?

Заранее спасибо.

Ответы [ 6 ]

8 голосов
/ 14 июля 2011

CustomNavigation.h

    #import <Foundation/Foundation.h>


    @interface UINavigationBar (UINavigationBarCustomDraw){

    }

    @end

CustomNavigation.m

    @implementation UINavigationBar (UINavigationBarCustomDraw)

    - (void) drawRect:(CGRect)rect {

        [self setTintColor:[UIColor colorWithRed:0.5f
                                           green: 0.5f
                                            blue:0 
                                           alpha:1]];

        if ([self.topItem.title length] > 0) {


            if ([self.topItem.title isEqualToString:@"First"]) {

                [[UIImage imageNamed:@"First.png"] drawInRect:rect];

            }

            else if ([self.topItem.title isEqualToString:@"Second"]) {

                [[UIImage imageNamed:@"Second.png"] drawInRect:rect];                   

            }




            CGRect frame = CGRectMake(0, 0, 320, 44);
            UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
            [label setBackgroundColor:[UIColor clearColor]];
            label.font = [UIFont boldSystemFontOfSize: 20.0];
            label.shadowColor = [UIColor colorWithWhite:0.0 alpha:1];
            label.textAlignment = UITextAlignmentCenter;
            label.textColor = [UIColor whiteColor];
            label.text = self.topItem.title;
            self.topItem.titleView = label;





        } 


        else {
            [[UIImage imageNamed:@"wood.png"] drawInRect:rect];
            self.topItem.titleView = [[[UIView alloc] init] autorelease];
        }



    }

    @end

, если вы хотите First.png для установки фонового изображения navigationBar в FirstViewController, тогда

в урFirstViewController.m

        -(void) viewWillAppear:(BOOL)animated{

        [super viewWillAppear:animated];



            self.title=@"First";
            [self.navigationController.navigationBar drawRect:CGRectMake(0, 0, 320, 480)];

    }

, если вы хотите Second.png установить фоновое изображение navigationBar в SecondViewController, тогда

в вашем SecondViewController.m

        -(void) viewWillAppear:(BOOL)animated{

        [super viewWillAppear:animated];



            self.title=@"Second";
            [self.navigationController.navigationBar drawRect:CGRectMake(0, 0, 320, 480)];

    }
1 голос
/ 09 ноября 2011

Или другой вариант, чтобы код выполнялся только в случае iOS 5

if([[UINavigationBar class] respondsToSelector:@selector(appearance)]) //iOS >=5.0
{
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBar-Landscape.png"] forBarMetrics:UIBarMetricsLandscapePhone];   

}
1 голос
/ 20 октября 2011

В iOS 5 это не будет работать, но хорошая новость заключается в том, что есть простой способ сделать это

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

ПРИМЕЧАНИЕ. Это будет работать только на iOS 5 и выше, поэтому обязательно проверьте iOSверсия, если вы хотите иметь обратную совместимость.

0 голосов
/ 09 мая 2012

Использование (SDK 3.2.5.) - В одном из моих приложений мне понадобилась навигационная панель с пользовательским изображением как в ландшафт , так и портрет .

То, что я сделал, было:

@implementation UINavigationBar (BackgroundImage)

- (void)drawRect:(CGRect)rect 
{
    UIImage *image;

    if(self.frame.size.width == 320) //for iPhone - portrait will have 320 pix width.
    {
        image = [UIImage imageNamed: @"portraitNavigationBar.png"];
    }
    else
    {
        image = [UIImage imageNamed: @"landscapeNavigationBar.png"];
    }

    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

К счастью, мое приложение поддерживает вращение, поэтому при вращении панель навигации автоматически перерисовывается.

Но чтобы вручную перерисовать его - вы также можете позвонить:

[navigationController.navigationBar setNeedsDisplay];
0 голосов
/ 17 ноября 2011

Вы можете попробовать таким образом

if([[UINavigationBar class] respondsToSelector:@selector(appearance)]) //iOS >=5.0
{
    //[[UINavigationBar appearance] setFrame:CGRectMake(0, 0, 320, 40)];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBar-Landscape.png"] forBarMetrics:UIBarMetricsLandscapePhone];   

    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
}

и в другом случае вы можете добавить предыдущий код, т.е. setBackgroundImage ....

0 голосов
/ 07 ноября 2011

Я пробовал это

[[Внешний вид UINavigationBar] setBackgroundImage: [UIImage imageNamed: @ "name"] forBarMetrics: UIBarMetricsDefault];

Работает нормально для iOS 5.0, но завис при iOS 4.3 или ниже.

Вы либо установили условный т. Е. Для

iOS 5

[[Внешний вид UINavigationBar] setBackgroundImage: [UIImage imageNamed: @ "name"] forBarMetrics: UIBarMetricsDefault];

еще

[[Внешний вид UINavigationBar] setBackgroundImage: [UIImage imageNamed: @ "name"]];

но все же есть проблема, что он показывает строку под изображением.

Или вы можете сделать так

self.navigationItem.hidesBackButton = YES; 
UINavigationBar *navBar = self.navigationController.navigationBar;

UIImage *image = [UIImage imageNamed:@"image.png"];
UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)];
imgView.image = image;
[tempView addSubview:imgView];
[navBar clearBackgroundImage];
[navBar addSubview:tempView];
[tempView release];
...