web-dev-qa-db-fra.com

Comment rendre la barre de navigation transparente dans iOS 10

J'ai le code suivant pour rendre la barre de navigation transparente, mais tout en affichant le bouton Précédent, cela fonctionne sur toutes les versions d'iOS, mais il ne fonctionne plus avec iOS 10 bêta.

    navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBar.shadowImage = UIImage()
    navigationBar.isTranslucent = true

Quelque chose a changé avec iOS 10 dans ce domaine?

Notez qu'il n'est pas possible d'utiliser navigationBar.isHidden car cela entraînerait la disparition du bouton précédent de la barre de navigation, du titre, etc.

7
Gruntcakes

Je ne sais pas ce qui a changé dans iOS 10 pour empêcher le code précédent de fonctionner, mais pour le corriger, j'ai créé une image transparente (elle ne doit avoir qu'un pixel) et j'ai utilisé le code suivant pour rendre la barre de navigation transparente. (mais en affichant toujours le bouton de navigation arrière).

    let transparentPixel = UIImage(named: "TransparentPixel")
    navigationBar.setBackgroundImage(transparentPixel, for: UIBarMetrics.default)
    navigationBar.shadowImage = transparentPixel
    navigationBar.backgroundColor = UIColor.clear()
    navigationBar.isTranslucent = true

Incidemment, si vous voulez changer la couleur de la barre de navigation, vous pouvez utiliser le même principe:

    let redPixel = UIImage(named: "RedPixel")
    navigationBar.setBackgroundImage(redPixel, for: UIBarMetrics.default)
    navigationBar.shadowImage = redPixel
    navigationBar.isTranslucent = false
10
Gruntcakes

La solution fournie par @Essence fonctionne parfaitement! 
C’est ce que j’utilise même pour créer l’image transparente à 1 pixel par code:

class MainClass: UIViewController {

  let transparentPixel = UIImage.imageWithColor(color: UIColor.clear)

  override func viewWillAppear(_ animated: Bool) {
    drawCustomNavigationBar()
  }

  func drawCustomNavigationBar() {
    let nav = (self.navigationController?.navigationBar)!
    nav.setBackgroundImage(transparentPixel, for: UIBarMetrics.default)
    nav.shadowImage = transparentPixel
    nav.isTranslucent = true
  }
}

extension UIImage {
  class func imageWithColor(color: UIColor) -> UIImage {
    let rect = CGRect(Origin: CGPoint(x: 0, y:0), size: CGSize(width: 1, height: 1))
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()!

    context.setFillColor(color.cgColor)
    context.fill(rect)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image!
  }
}
6
Danny182

Swift 3.x

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.backgroundColor = .clear
self.navigationController?.navigationBar.isTranslucent = true
1
juliancadi