Добавление изображения на панель навигации - PullRequest
31 голосов
/ 12 октября 2009

Я бы хотел, чтобы изображение занимало всю панель навигации. Это навигация, которая поставляется с приложением на основе навигации. Он появляется на RootViewController вместе с сопровождающим UITableView. Я видел несколько примеров того, как это может работать.

Установить заголовок панели навигации:

UIImage *image = [UIImage imageNamed:@"TableviewCellLightBlue.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar.topItem setTitleView:imageView];

Проблема в том, что она охватывает только заголовок, а не всю панель навигации.

Существует также эта тема: http://discussions.apple.com/message.jspa?messageID=9254241#9254241. В конце решения выглядит использование панели вкладок, которую я не использую. Сложно ли установить фон панели навигации? Есть ли какая-то другая более простая техника?

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

Ответы [ 9 ]

36 голосов
/ 12 октября 2009

В вашем случае это решение, найденное в другом ответе , будет работать хорошо.

С категорией «CustomImage», добавленной в UINavigationBar, затем вы можете просто позвонить:

UINavigationBar *navBar = self.navigationController.navigationBar;
UIImage *image = [UIImage imageNamed:@"yourNavBarBackground.png"];
[navBar setBackgroundImage:image];

Этот код должен идти в методе

- (void)viewWillAppear:(BOOL)animated

контроллера представления, где вы хотите получить пользовательское изображение. И в этом случае вам лучше позвонить:

[navBar clearBackgroundImage]; // Clear any previously added background image

перед setBackgroundImage (в противном случае оно будет добавлено несколько раз ...)

23 голосов
/ 27 сентября 2012

изменено для ios6, для работы в ios 6 используйте:

UINavigationBar *navBar = self.navigationController.navigationBar;
UIImage *image = [UIImage imageNamed:@"image.png"];
[navBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
9 голосов
/ 11 января 2011
UIImage *image = [UIImage imageNamed:@"YourImage.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

[self.navigationController.navigationBar addSubview:imageView];
8 голосов
/ 02 ноября 2010

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

self.navigationController.navigationBar.layer.contents = (id)[UIImage 
    imageNamed:@"background.png"].CGImage;

Вы должны будете не забыть добавить платформу Quartz Core в свой проект и добавить #import <QuartzCore/QuartzCore.h>, где бы вам ни понадобилось это сделать. Это гораздо более чистый и простой способ изменить слой рисунка для всего, что наследуется от UIView. Конечно, если вы хотите добиться аналогичного эффекта для всех панелей навигации или панелей вкладок, тогда имеет смысл создать подклассы.

4 голосов
/ 26 июня 2013

Просто добавьте эту строку.

 [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar.png"] forBarMetrics:UIBarMetricsDefault];

Bam! Одна строка и готово.

4 голосов
/ 05 мая 2012
UIImage *logo = [UIImage imageNamed:@"my_logo"];
UIImageView *logoView = [[UIImageView alloc]initWithImage:logo];
logoView.frame = CGRectMake(0, 0, 320, 37);

UINavigationController *searchNavCtrl = [[UINavigationController alloc] initWithRootViewController:searchViewController];
searchNavCtrl.navigationBar.barStyle = UIBarStyleBlack;


//searchNavCtrl.navigationItem.titleView = logoView;
//[searchNavCtrl.navigationController.navigationBar.topItem setTitleView:logoView];
[searchNavCtrl.navigationBar addSubview:logoView];

[logoView release];
3 голосов
/ 30 апреля 2011

Я использовал решение cmp и добавил некоторую логику для его удаления, так как мне нужно было только пользовательское фоновое изображение на домашнем экране в представлении.

HomeViewController.m

UIImage *image = [UIImage imageNamed:@"HomeTitleBG.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.tag = 10;

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10];

if ( testImgView != nil )
{
    NSLog(@"%s yes there is a bg image so remove it then add it so it doesn't double it", __FUNCTION__);
    [testImgView removeFromSuperview];

} else {
    NSLog(@"%s no there isn't a bg image so add it ", __FUNCTION__);
}

[self.navigationController.navigationBar addSubview:imageView];


[imageView release];

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

OtherViewController.m

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10];

if ( testImgView != nil )
{
    NSLog(@"%s yes there is a bg image so remove it", __FUNCTION__);
    [testImgView removeFromSuperview];  
} 

`

0 голосов
/ 14 сентября 2015

Добавление кода в appdelegate закончилось методом запуска

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
{
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault];
}
else
{
    [[UINavigationBar appearance] setBarTintColor:UIColorFromRGB(0x067AB5)];

    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

    // Uncomment to assign a custom backgroung image
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault];

    // Uncomment to change the back indicator image
    [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

    [[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]];
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@""]];

    // Uncomment to change the font style of the title

    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
    shadow.shadowOffset = CGSizeMake(0, 0);

    [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,shadow, NSShadowAttributeName,[UIFont fontWithName:@"HelveticaNeue-Bold" size:17], NSFontAttributeName, nil]];

    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault];
}
0 голосов
/ 13 мая 2014

просто зайдите в контроллер представления и вставьте в супер viewdidload и замените свое изображение в mainlogo, а затем установите заголовок навигации в настройке логотипа вашего изображения

  - (void)viewDidLoad
{
   [super viewDidLoad];

   //set your image frame
    UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0,0,70,45)] ;

  //set your image logo replace to the main-logo
   [image setImage:[UIImage imageNamed:@"main-logo"]];

   [self.navigationController.navigationBar.topItem setTitleView:image];

}
...