如何在Objective-C的navigationBar中心添加图像?

我在IOS中开发,我使用以下代码为navigationBar设置背景。

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

我想在navigationBarnavigationBar中心添加一个图像,如下图所示。

在此处输入图像描述

如何在Objective-C的navigationBar中心添加图像?

提前致谢。

设置导航标题视图如下所示

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


编辑:
如果你有大图像,那么使用下面的代码

 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; 

正如你所说的那样为应用程序设置一个图标。 您可能想要为此显示整个应用程序的图标。

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

输出:

在此处输入图像描述

这里要提到的一件事是为UIImageView使用宽度为3。 这很重要 – 如果它是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; 
  viewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourimage.png"]]; 

我遇到了同样的问题,因为iOS 11和Xcode 9开始使用自动布局管理导航栏而不是帧,你应该知道你的导航栏布局。

在WWDC Session 204中,更新了iOS 11的应用程序,声明UIToolBar和UINavigationBar已升级为使用自动布局,为了避免零大小的自定义视图,您应该了解一些相关信息。

UINavigation和UIToolBar提供位置,不关心它。

您必须使用以下某个选项提供自定义视图的大小:

  • 宽度和高度的约束。
  • 实现intrinsicContentSize
  • 通过约束连接您的子视图。

回答你的问题,我用一个ImageView设置了titleView,以两种不同的方式提供大小:

明确给出高度和宽度。

 -(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

尝试这个 :

  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]; 
 UIImageView *navbarImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo.png"]]; navbarImageView.contentMode = UIViewContentModeScaleAspectFit; self.navigationBar.titleView = navbarImageView;