【问题标题】:Navigation bar with UIImage for title标题为 UIImage 的导航栏
【发布时间】:2014-09-08 07:16:56
【问题描述】:

我想通过使用徽标图像而不是纯文本作为导航栏的标题来自定义我的应用程序的外观。当我使用此代码时

let logo = UIImage(named: "logo.png")
self.navigationItem.titleView = logo;

我收到错误“UIImage 无法转换为 UIView”。我怎样才能正确地做到这一点?

【问题讨论】:

    标签: ios cocoa-touch uiimage uinavigationbar


    【解决方案1】:

    把它放在UIImageView

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

    【讨论】:

    • 你把这个放在类声明的什么地方?
    • @JackWu 如果我将它添加到UINavigationController.viewDidLoad(我为导航控制器实现的类)它不起作用,但如果我添加到ViewController 它会起作用。但我想保持这段代码分开(所以在我的扩展 UINavigationController 的类中)。有可能吗?
    • @Ronaldoh1 这与您在回答中所做的完全相同,所以我不知道您怎么说“这不再起作用”
    • 这可行,但您必须在推送到导航控制器的视图控制器中使用viewDidLoad,而不是导航控制器本身。
    • 如果它不起作用,请确保将控制器的类设置为要放入此代码的文件。
    【解决方案2】:

    我用这个。它适用于 iOS 8

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let image = UIImage(named: "YOURIMAGE")
        navigationItem.titleView = UIImageView(image: image)
    }
    

    这是一个使用 CGRect 的示例。

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 38, height: 38))
        imageView.contentMode = .ScaleAspectFit
        let image = UIImage(named: "YOURIMAGE")
        imageView.image = image
        navigationItem.titleView = imageView
    }
    

    希望这会有所帮助。

    【讨论】:

    • 你把这个放在导航栏子类的什么地方?
    • @Hossein 我不记得了,已经有一段时间了,还没有这个项目。对不起。
    【解决方案3】:

    对于 swift 4,您可以调整 imageView 大小

     let logoContainer = UIView(frame: CGRect(x: 0, y: 0, width: 270, height: 30))
    
     let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 270, height: 30))
     imageView.contentMode = .scaleAspectFit
     let image = UIImage(named: "your_image")
     imageView.image = image
     logoContainer.addSubview(imageView)
     navigationItem.titleView = logoContainer
    

    【讨论】:

      【解决方案4】:

      我在上面尝试了@Jack 的回答,徽标确实出现了,但是图像占据了整个导航栏。我希望它适合。

      Swift 4、Xcode 9.2

      1.为导航控制器 UIImage 赋值。通过分割框架和图像大小调整大小。

      func addNavBarImage() {
      
              let navController = navigationController!
      
              let image = UIImage(named: "logo-signIn6.png") //Your logo url here
              let imageView = UIImageView(image: image)
      
              let bannerWidth = navController.navigationBar.frame.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
          }
      
      1. viewDidLoad()下添加函数

            addNavBarImage() 
        

      关于图片资源的注释。在上传之前,我用额外的边距调整了徽标,而不是在边缘裁剪。

      最终结果:

      【讨论】:

      【解决方案5】:

      您可以使用自定义 UINavigationItem,因此您只需在 Main.storyboard 上将“导航项”更改为 YourCustomClass。

      在 Swift 3 中

      class FixedImageNavigationItem: UINavigationItem {
      
      private let fixedImage : UIImage = UIImage(named: "your-header-logo.png")!
      private let imageView : UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 37.5))
      
      required init?(coder aDecoder: NSCoder) {
          super.init(coder: aDecoder)
          imageView.contentMode = .scaleAspectFit
          imageView.image = fixedImage
          self.titleView = imageView
      
      }
      
      }
      

      【讨论】:

        【解决方案6】:

        这在 2015 年 9 月对我有用 - 希望这对那里的人有所帮助。

        // 1
            var nav = self.navigationController?.navigationBar
            // 2 set the style 
            nav?.barStyle = UIBarStyle.Black
            nav?.tintColor = UIColor.yellowColor()
            // 3
            let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
            imageView.contentMode = .ScaleAspectFit
            // 4
            let image = UIImage(named: "logo.png")
            imageView.image = image
            // 5
            navigationItem.titleView = imageView
        

        【讨论】:

        • 如果此解决方案不起作用,请尝试在 UIViewController 类中创建对导航栏的引用。 @IBOutlet 弱 var navBar:UINavigationBar!然后代替navigationItem.titleView = imageViewself.navBar.topItem?.titleView = imageView这里解释一下:
        【解决方案7】:

        这是 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
        
        }
        

        【讨论】:

        • 这很好用。一个问题:我们如何确保图像始终是圆形的?圆角半径应该如何设置? @Gagandeep
        【解决方案8】:

        Swift 5.1、Xcode 11

        有时如果你的图像是高分辨率的,那么 imageView 会从中心移动,我建议使用这种方法

          lazy var navigationTitleImageView = UIImageView()
        
          override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            self.setNavigationBar()
            
            self.navigationTitleImageView.image = logo
            self.navigationTitleImageView.contentMode = .scaleAspectFit
            
            self.navigationTitleImageView.translatesAutoresizingMaskIntoConstraints = false
            
            if let navC = self.navigationController{
                navC.navigationBar.addSubview(self.navigationTitleImageView)
                self.navigationTitleImageView.centerXAnchor.constraint(equalTo: navC.navigationBar.centerXAnchor).isActive = true
                self.navigationTitleImageView.centerYAnchor.constraint(equalTo: navC.navigationBar.centerYAnchor, constant: 0).isActive = true
                self.navigationTitleImageView.widthAnchor.constraint(equalTo: navC.navigationBar.widthAnchor, multiplier: 0.2).isActive = true
                self.navigationTitleImageView.heightAnchor.constraint(equalTo: navC.navigationBar.widthAnchor, multiplier: 0.088).isActive = true
            }
        }
        

        和 viewWillDisappear()

          override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            self.navigationTitleImageView.removeFromSuperview()
        }
        

        否则只是缩小图像大小

        【讨论】:

          【解决方案9】:

          如果您更喜欢使用自动布局,并且想要在导航栏中永久固定图像,并且不会在每个屏幕中显示动画,则此解决方案效果很好:

          class CustomTitleNavigationController: UINavigationController {
          
          override func viewDidLoad() {
              super.viewDidLoad()
          
              let logo = UIImage(named: "MyHeaderImage")
          
              let imageView = UIImageView(image:logo)
              imageView.contentMode = .scaleAspectFit
              imageView.translatesAutoresizingMaskIntoConstraints = false
          
              navigationBar.addSubview(imageView)
          
              navigationBar.addConstraint (navigationBar.leftAnchor.constraint(equalTo: imageView.leftAnchor, constant: 0))
              navigationBar.addConstraint (navigationBar.rightAnchor.constraint(equalTo: imageView.rightAnchor, constant: 0))
              navigationBar.addConstraint (navigationBar.topAnchor.constraint(equalTo: imageView.topAnchor, constant: 0))
              navigationBar.addConstraint (navigationBar.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 0))
          }
          

          【讨论】:

            【解决方案10】:

            我为 iOS 10 和 iOS 11 编写了这个,它对我有用:

            extension UINavigationBar {
                func setupNavigationBar() {
                    let titleImageWidth = frame.size.width * 0.32
                    let titleImageHeight = frame.size.height * 0.64
                    var navigationBarIconimageView = UIImageView()
                    if #available(iOS 11.0, *) {
                        navigationBarIconimageView.widthAnchor.constraint(equalToConstant: titleImageWidth).isActive = true
                        navigationBarIconimageView.heightAnchor.constraint(equalToConstant: titleImageHeight).isActive = true
                    } else {
                        navigationBarIconimageView = UIImageView(frame: CGRect(x: 0, y: 0, width: titleImageWidth, height: titleImageHeight))
                    }
                    navigationBarIconimageView.contentMode = .scaleAspectFit
                    navigationBarIconimageView.image = UIImage(named: "image")
                    topItem?.titleView = navigationBarIconimageView
                }
            }
            

            【讨论】:

              【解决方案11】:

              可以像这样以编程方式完成。

              private var imageView: UIView {
              
                  let bannerWidth = navigationBar.frame.size.width * 0.5 // 0.5 its multiplier to get correct image width
                  let bannerHeight = navigationBar.frame.size.height
              
                  let view = UIView()
                  view.backgroundColor = .clear
                  view.frame = CGRect(x: 0, y: 0, width: bannerWidth, height: bannerHeight)
              
                  let image = UIImage(named: "your_image_name")
                  let imageView = UIImageView(image: image)
                  imageView.contentMode = .scaleAspectFit
                  imageView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
              
                  view.addSubview(imageView)
              
                  return view
              }
              

              刚刚改变titleView

              navigationItem.titleView = imageView
              

              【讨论】:

                【解决方案12】:

                让我们尝试结帐

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

                【讨论】:

                • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                【解决方案13】:
                    let imageView = UIImageView(frame: (CGRect(x: 0, y: 0, width: 40, height: 
                    40)))
                    imageView.contentMode = .scaleAspectFit
                    let image = UIImage (named: "logo") // logo is your NPG asset 
                    imageView.image = image
                    self.navigationItem.titleView = imageView
                

                【讨论】:

                • 请详细说明您的代码的作用。在 StackOverflow 中,仅代码的答案被视为质量差。
                【解决方案14】:

                在 swift 4 中为我工作(方形图像 40x40)

                let imageView = UIImageView()
                imageView.frame.size.width = 40
                imageView.frame.size.height = 40
                imageView.contentMode = .scaleAspectFit
                let image = UIImage(named: "YOUR_IMAGE_NAME")
                imageView.image = image
                navigationItem.titleView = imageView
                

                如果您想要其他措施,请尝试

                let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 100.5)))
                imageView.contentMode = .scaleAspectFit
                let image = UIImage(named: "YOUR_IMAGE_NAME")
                imageView.image = image
                navigationItem.titleView = imageView
                

                我希望它对你有用。它对我有用。

                【讨论】:

                  【解决方案15】:

                  Objective-C 版本:

                  //create the space for the image
                  UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 256, 144)];
                  //bind the image with the ImageView allocated
                  myImage.image = [UIImage imageNamed:@"logo.png"];
                  //add image into imageview
                  _myNavigationItem.titleView = myImage;
                  

                  以防万一有人(比如我)来到这里寻找 Objective-C 中的答案。

                  【讨论】:

                    【解决方案16】:

                    这对我有用...试试看

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

                    【讨论】:

                      【解决方案17】:

                      为了获得大小合适且居中的图像视图,您应该使用以下方法:

                      let width = 120 // choose the image width
                      let height = 20 // choose the image height
                      let titleView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 44)) //44 is the standard size of the top bar
                      let imageView = UIImageView(frame: CGRect(x: (view.bounds.width - width)/2, y: (44 - height)/2, width: width, height: height))
                      imageView.contentMode = .scaleAspectFit //choose other if it makes sense
                      imageView.image = UIImage(named: "your_image_name")
                      titleView.addSubview(imageView)
                      navigationItem.titleView = titleView
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-02-09
                        • 2013-12-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多