22

我在 UIViewController 的 viewDidLoad 中使用了这段代码。我没有错误。图像存在。我得到了背景,但没有图像。图像是一种标志。

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {

    /* Background of navigationBar. */
    UIImage * navigationBarImage = [UIImage imageNamed:@"01_navbar_portrait.png"];
    [self.navigationController.navigationBar setBackgroundImage:navigationBarImage forBarMetrics:UIBarMetricsDefault];

    /* Image in navigationBar */
    UIImage * logoInNavigationBar = [UIImage imageNamed:@"01_logo.png"];
    UIImageView * logoView = [[UIImageView alloc] init];
    [logoView setImage:logoInNavigationBar];
    self.navigationController.navigationItem.titleView = logoView;

}
4

7 回答 7

54

通过查看导航堆栈上最顶层视图控制器UINavigationController的属性来管理导航栏。navigationItem所以要将视图更改为徽标,您需要在使用徽标的视图控制器中进行设置(即根视图控制器或另一个被推送到堆栈上的视图控制器)。

viewDidLoad在你的视图控制器中做这样的事情:

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

在您的情况下,您设置了错误的导航项:

// Oops...
self.navigationController.navigationItem.titleView = logoView;
// Should be this:
self.navigationItem.titleView = logoView;
于 2013-03-04T11:16:02.887 回答
9

首先,我们必须创建一个与导航栏大小相同的视图,然后添加一个图像视图并将其框架设置为在导航栏中看起来居中。它适用于所有 ios 版本,它会根据设备自动采用框架大小(视网膜或正常)并且像魔术一样工作。

UIView *headerView = [[UIView alloc] init];
headerView.frame = CGRectMake(0, 0, 320, 44);

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Header.png"]];
imgView.frame = CGRectMake(75, 0, 150, 44);
imgView.contentMode = UIViewContentModeScaleAspectFit;

[headerView addSubview:imgView];

navigationCtrl.navigationBar.topItem.titleView = headerView;

[headerView release];
[imgView release];
于 2013-05-15T05:39:56.093 回答
7

迅速:

var logoImage:UIImage = UIImage(named: "logo_text")!
self.navigationItem.titleView = UIImageView(image: logoImage)
于 2014-12-10T10:26:13.797 回答
4
extension UINavigationController {
func addLogoImage(image: UIImage, navItem: UINavigationItem) {
    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFit
    imageView.translatesAutoresizingMaskIntoConstraints = false

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 44))
    view.addSubview(imageView)

    navItem.titleView = view
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    imageView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
    imageView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

    view.heightAnchor.constraint(equalTo: navigationBar.heightAnchor).isActive = true
    view.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor).isActive = true
    view.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor).isActive = true
}
}

这是我正在使用的。

当然,您可能需要更多的约束,以免与左右栏按钮项发生冲突。

于 2017-11-13T14:35:28.577 回答
2

也许不是你的意思,但我遇到了这个页面,寻找一种为导航栏提供居中背景图像的方法,所以如果你在这里......这是一种方法。

从另一个答案中窃取一点,您可以将图像分解为前景和背景,然后构建一个拉伸背景并使前景居中的新图像,然后将其设置为导航栏的背景图像。构建图像的工作方式如下:

// build an image by stretching the bg, then merging it with the fg
CGSize barSize = self.navController.navigationBar.frame.size;
UIImage *fg = [UIImage imageNamed:@"some_fg"];
UIImage *bg = [[UIImage imageNamed:@"some_bg"]
               resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,1.f,0.f,1.f)];
UIGraphicsBeginImageContextWithOptions(barSize, NO, 0.0);
[bg drawInRect:CGRectMake(0, 0, barSize.width, barSize.height)];
[fg drawInRect:CGRectMake((barSize.width-fg.size.width)/2.f,
                          0,
                          fg.size.width,
                          fg.size.height)];
// grab the merged images
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2016-02-22T11:41:58.627 回答
1

您只需指定它的框架

logoView.frame = CGRectMake(initialize frame here);

然后使用以下

[self.navigationItem setTitleView:logoView];
于 2013-03-04T11:15:39.810 回答
0
func centeredNavBarImage (){
    let navcontroller = navigationController!
    let image = #imageLiteral(resourceName: "yourImage")
    let imageView = UIImageView(image:image)

    let bannerWidth = navcontroller.navigationItem.accessibilityFrame.size.width
    let bannerHeight = navcontroller.navigationBar.frame.size.height


    let bannerX = bannerWidth / 2 - image.size.width / 2
    let bannerY = bannerHeight / 2 - image.size.height / 2

    imageView.frame = CGRect(x: bannerX, y: bannerY, width: bannerWidth, height: bannerHeight)
    imageView.contentMode = .scaleAspectFit

    navigationItem.titleView = imageView

}

这是来自https://youtu.be/bLkuu_fmlsU的修改代码

bannerWidth 考虑了我在导航栏右侧的刷新按钮项。似乎工作。

在 ViewDidLoad 上运行函数

于 2019-02-24T01:18:04.130 回答