我想通过使用徽标图像(而不是纯文本)作为导航栏的标题来自定义应用程序的外观。当我使用此代码
let logo = UIImage(named: "logo.png")
self.navigationItem.titleView = logo;
我收到错误“ UIImage无法转换为UIView”。如何正确执行此操作?
Answers:
放在里面 UIImageView
let logo = UIImage(named: "logo.png")
let imageView = UIImageView(image:logo)
self.navigationItem.titleView = imageView
    UINavigationController.viewDidLoad(为导航控制器实现的类),则不起作用,但如果将其添加到,则它可以工作ViewController。但我想将此代码分开(因此在扩展UINavigationController的类中)。可能吗?
                    viewDidLoad在推送到导航控制器的视图控制器中使用,而不是在导航控制器本身中使用。
                    我用这个 它适用于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
}
希望这会有所帮助。
对于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
    我在上面尝试了@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
    }
在下面添加功能 viewDidLoad()
    addNavBarImage() 
注意图像资产。上传之前,我调整了徽标的余量,而不是在边缘进行裁切。
最后结果:
您可以使用自定义UINavigationItem,因此只需在Main.storyboard上将“ Navigation Item”更改为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
}
}
    这在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
    navigationItem.titleView = imageView做     self.navBar.topItem?.titleView = imageView  它在这里解释:
                    这是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
}
    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()
}
否则只是缩小图像尺寸
如果您希望使用自动布局,并希望在导航栏中添加永久的固定图像,并且该图像不会与每个屏幕一起显示,则此解决方案效果很好:
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))
}
    我为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
    }
}
    让我们尝试结帐
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
        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
    在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
我希望它能为您服务。这个对我有用。
可以像这样以编程方式完成。
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
    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中寻找答案。
为了获得具有适当大小且在中心的图像视图,您应该使用以下方法:
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