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

Я разрабатываю в IOS, я использую следующий код, чтобы установить фон для navigationBar.

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar-back"] forBarMetrics:UIBarMetricsDefault];

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

введите здесь описание изображения

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

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


person Wun    schedule 29.01.2015    source источник


Ответы (6)


Настройте вид заголовка навигации, как показано ниже

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"img.png"]];



EDIT:
если у вас большое изображение, используйте код ниже

UIImage *img = [UIImage imageNamed:@"1.png"];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[imgView setImage:img];
// setContent mode aspect fit
[imgView setContentMode:UIViewContentModeScaleAspectFit];
self.navigationItem.titleView = imgView;
person Jageen    schedule 29.01.2015
comment
Кампай さま изображение большое ? вы также можете установить рамку изображения, как предложил Нитин, создать изображение на ваше усмотрение - person Jageen; 29.01.2015
comment
дайте мне ссылку на изображение, я дам загрузить демо-приложение - person Jageen; 29.01.2015
comment
Хорошо, подождите 10 минут, и мы вернемся с демо-ссылкой. - person Jageen; 29.01.2015
comment
Ты мой герой на этот день!! - person Ravi; 09.11.2016

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

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon"]];
CGSize imageSize = CGSizeMake(40, 40);
CGFloat marginX = (self.navigationController.navigationBar.frame.size.width / 2) - (imageSize.width / 2);

imageView.frame = CGRectMake(marginX, 0, imageSize.width, imageSize.height);
[self.navigationController.navigationBar addSubview:imageView];

Вывод:

введите здесь описание изображения

person Kampai    schedule 29.01.2015

Я столкнулся с той же проблемой, поскольку iOS 11 и Xcode 9 начали управлять панелями навигации с автоматическим макетом вместо фреймов, вы должны знать о макете панели навигации.

В сеансе 204 WWDC «Обновление вашего приложения для iOS 11» было указано, что UIToolBar и UINavigationBar были обновлены для использования автоматического макета, и чтобы избежать пользовательских представлений с нулевым размером, вы должны знать об этом несколько вещей.

UINavigation и UIToolBar предоставляют позицию, не заботясь об этом.

Вы должны указать размер пользовательского представления одним из следующих способов:

  • Ограничения по ширине и высоте.
  • Реализовать встроенный ContentSize
  • Соедините свои подпредставления через ограничения.

Отвечая на ваш вопрос, я установил titleView с помощью ImageView, указав размер двумя разными способами:

Явное указание высоты и ширины.

-(void)updateNavTitleView{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[ UIImage imageNamed:@"TitleViewImage"]];
    [imageView.widthAnchor constraintEqualToConstant:160].active = YES;
    [imageView.heightAnchor constraintEqualToConstant:44].active = YES;
    self.navigationItem.titleView = imageView;
}

Или установите режим соотношения сторон как aspectFit

-(void) updateNavTitleView{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[ UIImage imageNamed:@"TitleViewImage"]];
    [imageView setContentMode:UIViewContentModeScaleAspectFit];
    self.navigationItem.titleView = imageView;
}

Если вы хотите посмотреть сеанс, сеанс 204

person Andrés Sánchez    schedule 04.12.2017

Здесь следует упомянуть одну вещь: использовать ширину 3 для UIImageView. Это важно — если будет 2 (или любое четное число), то изображение будет размытым. Установка clipToBounds=NO и contentMode=UIViewContentModeScaleAspectFill означает, что изображение будет отображаться за пределами ширины представления изображения (хорошо) и будет иметь правильные пропорции.

UIImageView *imageView = [[UIImageView alloc]
        initWithFrame:CGRectMake(0,0,3,44)];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.clipsToBounds = NO;
    imageView.image = [UIImage imageNamed:@"navigation-logo"];
    controller.navigationItem.titleView = imageView;
person Ronaldoh1    schedule 21.08.2015

Если кому-то нужно было сделать это в Swift (4.2):

запишите следующую функцию:

func addMiddleImage(){
    //Initialize your UIImage
    let yourImage = UIImage(named: "imageName")!.withRenderingMode(.alwaysOriginal)

    //Initialize a UIImageView
    let imageView = UIImageView(image: yourImage)

    //Set your Navigation Bar to the inialized UIImageView
    self.navigationItem.titleView = imageView

}

добавьте его в свой обратный вызов ViewDidLoad():

 override func viewDidLoad() {
    super.viewDidLoad()
    self.addMiddleImage()
}

Удачи

person MhmdRizk    schedule 02.03.2019

попробуй это :

 UIImage *logo = [UIImage imageNamed:@"logo.png"];
 UIImageView *imageView = [[UIImageView alloc] initWithImage: logo];
 imageView.frame = CGRectMake(160, 2, 40, 40);
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logo];
person Nitin    schedule 29.01.2015