web-dev-qa-db-fra.com

Barre de navigation avec UIImage pour le titre

Je souhaite personnaliser l'apparence de mon application en utilisant une image de logo comme titre de la barre de navigation, au lieu d'un texte brut. Quand j'utilise ce code

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

Je reçois le message d'erreur "UIImage n'est pas convertible en UIView". Comment puis-je faire cela correctement?

52
Darx

Mettez-le dans une UIImageView

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

Je l'utilise. Cela fonctionne sous 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)
}

Et voici un exemple comment vous pouvez le faire avec 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
}

J'espère que cela aidera.

44
Fernando S. Kroes

Pour Swift 4 et vous pouvez ajuster la taille de l'image 

 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
14
vp2698

Vous pouvez utiliser UINavigationItem personnalisé. Il vous suffit donc de modifier "Elément de navigation" en tant que YourCustomClass sur Main.storyboard.

Dans 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

}

}
9
Photon Point

J'ai essayé la réponse de @ Jack ci-dessus, le logo apparaît, mais l'image occupe toute la barre de navigation. Je voulais que ça rentre.

Swift 4, Xcode 9.2

1. Attribuez une valeur au contrôleur de navigation, UIImage. Ajustez la taille en divisant le cadre et la taille de l'image.

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. Ajoutez la fonction juste sous viewDidLoad()

        addNavBarImage() 
    

Note sur la ressource image. Avant de télécharger, j'ai ajusté le logo avec des marges supplémentaires plutôt que de recadrer les bords.

Résultat final:

 enter image description here

8
Cons Bulaquena

cela a fonctionné pour moi en septembre 2015 - J'espère que cela aidera quelqu'un. 

// 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
5
Ronaldoh1

Si vous préférez utiliser l'autolayout et souhaitez une image fixe permanente dans la barre de navigation, qui ne s'anime pas avec chaque écran, cette solution fonctionne bien:

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))
}
2
danfordham

essayons de passer à la caisse

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
2

Voici une fonction pratique pour Swift 4.2, affiche une image avec le texte du titre: -

 enter image description here

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

}
1
Gagandeep Gambhir

Cela a fonctionné pour moi ... essayez-le

 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
0
Sohail

Fonctionne pour moi dans Swift 4 (image carrée 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

Si vous voulez d'autres mesures, essayez

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

J'espère que ça vous sert. Ça marche pour moi.

0
oscar castellon

J'ai écrit ceci pour iOS 10 et iOS 11 et cela a fonctionné pour moi:

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
    }
}
0
Narine Balasanyan
    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
0
mila kohen