带有UIImage标题的导航栏

Dar*_*arx 64 cocoa-touch uinavigationbar uiimage ios

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

let logo = UIImage(named: "logo.png")
self.navigationItem.titleView = logo;
Run Code Online (Sandbox Code Playgroud)

我收到错误"UIImage无法转换为UIView".我该怎么做才能正确?

Jac*_*ack 162

把它放在里面 UIImageView

let logo = UIImage(named: "logo.png")
let imageView = UIImageView(image:logo)
self.navigationItem.titleView = imageView
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但你必须在推送到导航控制器的视图控制器中使用`viewDidLoad`,而不是导航控制器本身. (3认同)

Fer*_*oes 50

我用这个.它适用于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)
}
Run Code Online (Sandbox Code Playgroud)

以下是如何使用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
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助.

  • 这样效果更好,并且图像按我的意愿缩放。这应该是公认的答案。 (2认同)

vp2*_*698 25

对于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
Run Code Online (Sandbox Code Playgroud)


Con*_*ena 10

我试过上面@ 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
    }
Run Code Online (Sandbox Code Playgroud)
  1. 在下面添加功能 viewDidLoad()

        addNavBarImage() 
    
    Run Code Online (Sandbox Code Playgroud)

关于图像资产的注意事项.在上传之前,我使用额外的边距调整徽标,而不是在边缘裁剪.

最后结果:

在此输入图像描述


Pho*_*int 9

您可以使用自定义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

}

}
Run Code Online (Sandbox Code Playgroud)


Ron*_*oh1 5

这在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
Run Code Online (Sandbox Code Playgroud)


Gag*_*hir 5

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

}
Run Code Online (Sandbox Code Playgroud)