【问题标题】:How to put an image as the navigation bar title如何将图像作为导航栏标题
【发布时间】:2009-05-14 19:18:40
【问题描述】:

我想在导航栏中间放置一个 .png 图像,而不是用文本写的标题。你能告诉我怎么做吗?

谢谢。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    设置navigationItem的titleView

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

    【讨论】:

    • 标题的 UIImage 的大小应该是多少?我尝试了 180*40,但它变得模糊了。
    • 这在 iOS 7.1 中完美运行(当然,没有“自动释放”)我的图像尺寸为 296x40px (2x),显示完美。谢谢!
    • 只是添加一个小费。快速代码将是: let imgTitleBar = UIImage(named: "iphone-menu.png") self.navItem.titleView = UIImageView(image: imgTitleBar)
    【解决方案2】:

    斯威夫特 4.2
    包括建议的框架/缩放

    let image: UIImage = UIImage(named: "image.png")!
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
    imageView.contentMode = .scaleAspectFit
    imageView.image = image
    self.navigationItem.titleView = imageView
    

    【讨论】:

    • 谢谢@Michael-R ....但是在我添加以下代码后,我的导航项标题没有显示
    • 自发布此答案以来,Swift 和 iOS 发生了一些变化,我会尽快尝试看看
    • 哥们,你太棒了
    【解决方案3】:

    您可以更改 UINavigationBar 中的所有视图。如果您尝试更改导航控制器中的导航栏,请执行以下操作:

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

    如果您自己创建导航栏,请执行相同操作,但不要调用 self.navigationItem 调用:navigationBar.topItem

    【讨论】:

    • 标题的 UIImage 的大小应该是多少?我尝试了 180*40,但它变得模糊了。
    【解决方案4】:

    如果有人在 Swift 4.2 的导航栏标题视图中需要图像和文本,请试试这个功能:-

    override func viewDidLoad() {
    
        super.viewDidLoad()
    
        //Sets the navigation title with text and image
        self.navigationItem.titleView = navTitleWithImageAndText(titleText: "Dean Stanley", imageName: "online")
    }
    
    func navTitleWithImageAndText(titleText: String, imageName: String) -> UIView {
    
        // Creates a new UIView
        let titleView = UIView()
    
        // Creates a new text label
        let label = UILabel()
        label.text = titleText
        label.sizeToFit()
        label.center = titleView.center
        label.textAlignment = NSTextAlignment.center
    
        // Creates the image view
        let image = UIImageView()
        image.image = UIImage(named: imageName)
    
        // Maintains the image's aspect ratio:
        let imageAspect = image.image!.size.width / image.image!.size.height
    
        // Sets the image frame so that it's immediately before the text:
        let imageX = label.frame.origin.x - label.frame.size.height * imageAspect
        let imageY = label.frame.origin.y
    
        let imageWidth = label.frame.size.height * imageAspect
        let imageHeight = label.frame.size.height
    
        image.frame = CGRect(x: imageX, y: imageY, width: imageWidth, height: imageHeight)
    
        image.contentMode = UIView.ContentMode.scaleAspectFit
    
        // Adds both the label and image view to the titleView
        titleView.addSubview(label)
        titleView.addSubview(image)
    
        // Sets the titleView frame to fit within the UINavigation Title
        titleView.sizeToFit()
    
        return titleView
    
    }
    

    【讨论】:

    • 太棒了,我一直在找这个。
    【解决方案5】:

    使用 Swift 2.x 更新

    navigationItem.titleView = UIImageView.init(image: UIImage(named:"yourImageName"))
    

    【讨论】:

      【解决方案6】:

      Swift 5 版本:

      navigationItem.titleView = UIImageView(image: UIImage(named: "logo.png"))
      

      【讨论】:

        【解决方案7】:

        在寻找这个问题的答案时,我在Apple Discussions forum 中找到了一个不错且简单的解决方案,将-(void)drawRect:(CGRect)rect 覆盖为UINavigationBar

        @implementation UINavigationBar (CustomImage)
        - (void)drawRect:(CGRect)rect {
            UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
            [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        }
        @end
        

        【讨论】:

        • 我会说这不是最好的解决方案,因为无论如何都可以设置标题,它更像是一个 hack,但它可以轻松解决问题并且有效。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 2015-01-27
        • 2018-04-14
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        相关资源
        最近更新 更多