it-roy-ru.com

Как добавить фоновое изображение на панель навигации iphone?

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

Это правильно?

//set custom background image
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"NavigationBackground.png"]];
[self.navigationBar insertSubview:backgroundView atIndex:0];
[backgroundView release];
32
Momi

Вот код из link @luvieere упомянутый . Вставьте этот код в контроллер rootview чуть выше @implementation rootviewController

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

Начиная с iOS 5, есть официальный способ сделать это. (см. Библиотека разработчиков iOS )

// someplace where you create the UINavigationController
if ([navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
    UIImage *image = [UIImage imageNamed:@"NavigationBar.png"];
    [navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}

Но все же сохраните старый код для обратной совместимости, если вы действительно не хотите отказаться от iOS 4 и ниже.

98
iwat

Ваш код сам по себе этого не сделает, вам придется написать категорию, чтобы он работал. Есть два подхода к тому, как вы должны это сделать: первый заключается в том, чтобы сделать изображение подпредставлением вашего UINavigationBar и ​​перенести его на передний план в каждом из ваших UIViewController 'viewDidAppear методов , Это, однако, сообщалось о некоторых проблемах с покрытием права UIBarButtonItem. Другой метод предполагает переопределение 

- (void)drawRect:(CGRect)rect 

и рисование изображения там. Оба из них широко освещены в этот блог обсуждение ..

32
luvieere

Самый простой способ - просто установить содержимое слоя UINavigationBar.

NSString *barBgPath = [[NSBundle mainBundle] pathForResource:@"mybgimage" ofType:@"png"];
[nBar.layer setContents: (id)[UIImage imageWithContentsOfFile: barBgPath].CGImage];

Недостатком является то, что кнопки не генерируются из-за правильного оттенка, но вы можете установить цвет панели навигации на то, что ближе всего к вашему изображению bg, и об оттенке следует позаботиться.

9
drunknbass

в ios5 я установил фоновое изображение панели навигации (для всех изображений панели навигации) в AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
    UIImage *navBarBackgroundImage = [UIImage imageNamed:@"nav_bg"];
    [[UINavigationBar appearance] setBackgroundImage:navBarBackgroundImage forBarMetrics:UIBarMetricsDefault];
    return YES;
}
8
jianpx

Я бы сделал это в appdelegate что-то вроде

+ (void)Generalstyle {
    //navigationbar
    UINavigationBar *navigationBar = [UINavigationBar appearance];
    [navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation.png"] forBarMetrics:UIBarMetricsDefault];

}

И в 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [[self class] Generalstyle];

}

.h файл:

+ (void) Generalstyle;
8
Blazer

Этот работает нормально в iOS 6 и 7 

UINavigationBar *navBar = [[self navigationController] navigationBar];
  UIImage *backgroundImage = [UIImage imageNamed:@"nav-bar-background-normal"];
  [navBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
2
Gurumoorthy Arumugam

Когда придет iphone 5, мы должны установить оба типа устройств. Так что используйте это

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];
}

Для получения дополнительной информации перейдите по этой ссылке ссылка

2
Isuru Jayathissa

Swift версия

let navBar = UINavigationBar.appearance();
navBar.setBackgroundImage(UIImage(named: "yourImageName"), forBarMetrics: .Default)

Обновлен Swift 3.2

let navBar = UINavigationBar.appearance();
        navBar.setBackgroundImage(UIImage(named: "yourImageName"), for: .default)
1
Babul Prabhakar

Вы также можете добавить категорию, которая расширяет класс UINavigationBar и переопределить метод drawRect: в категории.

0
nduplessis

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

1) background.png => 320x44
2) [email protected] => 640x88 // используется для iPhone5 и для устройств Retina
3) [email protected] => 1334x183 // используется для iPhone6 

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

[self.navigationController.navigationBar setBackgroundImage:[[UIImage imageNamed:@"background"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch] forBarMetrics:UIBarMetricsDefault];
0
Aamir

Попробуйте этот код в своем классе AppDelegate, чтобы отобразить изображение на панели навигации. Это поможет вам много. 

[[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"headerImg.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)] forBarMetrics:UIBarMetricsDefault];
0
Shahzaib Maqbool

то, что я сделал, просто создал UIImage с изображением, которое я хотел, и добавил к панели навигации, как это. 

UIImage *image = [UIImage imageNamed:@"yourImage.png"];

[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
0
Alcides Eduardo Zelaya