Фоновое изображение для навигации - PullRequest
10 голосов
/ 11 июня 2009

У меня проблемы с правильным отображением фонового изображения вида навигации. Вот картинка:

alt text

Вот код:

- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {

        UIImage *image = [UIImage imageNamed: @"bg_table_active.png"];
        UIImageView *imageview = [[UIImageView alloc] initWithImage: image];
        UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
                                       initWithTitle:NSLocalizedString(@"Settings", @"")
                                       style:UIBarButtonItemStyleDone
                                       target:self
                                       action:@selector(GoToSettings)];
        self.navigationItem.titleView = imageview;
        self.navigationItem.rightBarButtonItem = addButton;
        self.navigationItem.hidesBackButton = TRUE;
    }
    return self;
}

Как сделать так, чтобы изображение растянулось на весь вид навигации?

Ответы [ 8 ]

24 голосов
/ 12 августа 2009

Я делаю именно это в своем приложении. В AppDelegate у меня есть этот код:

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect
{
  UIImage *image = [UIImage imageNamed: @"custom_nav_bar.png"];
  [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
9 голосов
/ 12 января 2010

Я изменил версию Майка Рандла , чтобы при необходимости можно было настроить пользовательское изображение. Я также объединил предложенные изменения 40-фунтового костюма пчел. initImageDictionary должен быть вызван во время инициализации:

//UINavigationBar+CustomImage.h
#import <Foundation/Foundation.h>

@interface UINavigationBar(CustomImage)
+ (void) initImageDictionary;
- (void) drawRect:(CGRect)rect;
- (void) setImage:(UIImage*)image;
@end


//UINavigationBar+CustomImage.m    
#import "UINavigationBar+CustomImage.h"
//Global dictionary for recording background image
static NSMutableDictionary *navigationBarImages = NULL;

@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image

+ (void)initImageDictionary
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }   
}

- (void)drawRect:(CGRect)rect
{
    NSString *imageName=[navigationBarImages objectForKey:[NSValue valueWithNonretainedObject: self]];
    if (imageName==nil) {
        imageName=@"header_bg.png";
    }
    UIImage *image = [UIImage imageNamed: imageName];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
    [navigationBarImages setObject:image forKey:[NSValue valueWithNonretainedObject: self]];
}
@end
1 голос
/ 12 декабря 2012

Вы можете использовать это также

if([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
        //iOS 5 new UINavigationBar custom background
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbg_ForiPhone5_Imagename.png"] forBarMetrics: UIBarMetricsDefault];
    } else {
        [self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbg_ForOtherIphone_Imagename.png"]] atIndex:0];
    }

`

1 голос
/ 22 апреля 2010
1 голос
/ 27 февраля 2010

Код Майка Рандла и Казебаша великолепен. Я использовал [NSValue valueWithNonretainedObject: self], чтобы избежать ошибки copyWithZone. Обтекание себя в объекте NSValue позволяет скопировать его в словарь navigationBarImages.

<code>
- (void)drawRect:(CGRect)rect
{
    NSString *imageName=[navigationBarImages objectForKey:[NSValue valueWithNonretainedObject:self]];
...}

<code>
- (void)setImage:(NSString*)image
{
    [navigationBarImages setObject:image forKey:[NSValue valueWithNonretainedObject:self]];
}
0 голосов
/ 04 июня 2013
 UIImage *image = [UIImage imageNamed: @"navigator.png"];

[_ homeNavigationController.navigationBar setBackgroundImage: изображение для BarMetrics: UIBarMetricsDefault];

0 голосов
/ 03 июля 2009

К сожалению, нет поддержки использования пользовательских фоновых изображений на панели навигации в iPhone OS 3.0 или любых предыдущих версиях. Единственный способ настроить внешний вид - установить стиль и цветовой оттенок. Не идеально, я знаю.

В своем коде вы пытаетесь растянуть заголовок панели навигации, чтобы «перейти под» правую кнопку. Но это невозможно, поскольку три вида панели навигации (кнопка «Назад», заголовок и правая кнопка) должны находиться в одном слое и настраиваться таким образом, чтобы не перекрываться. Это особенность.

Я знаю, что есть ряд сторонних приложений, которые изменяют фоновое изображение, но они "взламывают" систему и используют неподдерживаемые частные API: или предположения о внутренних структурах данных панели навигации. Эти программы, скорее всего, потерпят неудачу (аварийно завершат работу или отобразятся неправильно) в будущих версиях iPhone OS.

Скорее всего, вы не хотите с этим связываться. Примите тот факт, что у вас (пока) не может быть собственного фонового изображения в панелях навигации. Это больно, я знаю. Но если вы взломаете систему и ваше приложение выйдет из строя в следующих версиях ОС, Apple заберет это приложение из магазина приложений, и вы потеряете весь доход до тех пор, пока не измените приложение. Это твой звонок ...

0 голосов
/ 01 июля 2009

http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/UsingNavigationControllers/UsingNavigationControllers.html#//apple_ref/doc/uid/TP40007457-CH7

Глядя на рисунок 1 в этой ссылке - было бы лучше установить backgroundImage на панели навигации, а не на элемент навигации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...