如何在Objective-C中将一张图片添加到navigationBar的中央?

17

我正在开发 IOS 应用程序,我使用以下代码为 navigationBar 设置背景。

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

我想在navigationBar的中央添加一张图片,就像下面的图片一样:

enter image description here

如何在Objective-C中将图像添加到navigationBar的中心位置?

提前致谢!

8个回答

38

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

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;

kampai さま的图片很大吗?你也可以像Nitin建议的那样设置图片框架,创建一个图片取决于你。 - Jageen
给我图片链接,我会提供上传演示应用程序。 - Jageen
好的,请等待10分钟,我会返回演示链接。 - Jageen
你今天是我的英雄!! - Ravi

7

如您所言,要为应用程序设置图标。您可以选择此选项,它将为整个应用程序显示图标。

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

输出: enter image description here

3

我曾面临同样的问题,自从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个会话


2

需要注意的一点是,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;

1
 viewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourimage.png"]];

1
如果有人需要使用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()
}

祝你好运


0
试试这个:
 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];

0
UIImageView *navbarImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo.png"]];
navbarImageView.contentMode = UIViewContentModeScaleAspectFit;
self.navigationBar.titleView = navbarImageView;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接