J'essaie de rendre ma UINavigationBar
dans UINavigationController
transparente. J'ai créé une sous-classe de UINavigationController
et je l'ai aimé pour une scène de mon fichier de storyboard. Voici un morceau de ma sous-classe:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let size = self.navigationBar.frame.size
self.navigationBar.setBackgroundImage(imageWithColor(UIColor.blackColor(), size: size, alpha: 0.2), forBarMetrics: UIBarMetrics.Default)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func imageWithColor(color: UIColor, size: CGSize, alpha: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(size)
let currentContext = UIGraphicsGetCurrentContext()
let fillRect = CGRectMake(0, 0, size.width, size.height)
CGContextSetFillColorWithColor(currentContext, color.CGColor)
CGContextSetAlpha(currentContext, alpha)
CGContextFillRect(currentContext, fillRect)
let retval: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return retval
}
Lorsque j'exécute mon application, la barre de navigation est transparente, mais la barre d'état est tout simplement noire.
Par exemple, si je fais ce genre de chose sur UITabBar
- cela fonctionne.
J'espère que ça vous aidera
Swift 2:
self.navigationController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationController.navigationBar.shadowImage = UIImage()
self.navigationController.navigationBar.isTranslucent = true
self.navigationController.view.backgroundColor = UIColor.clearColor()
Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
Ou si vous souhaitez sous-classer le contrôleur de navigation, reportez-vous à ceci answer .
Changer le style de la barre d'état via:
Dans votre Info.plist, vous devez définir l'apparence de la barre d'état du contrôleur d'affichage} à toute valeur.
UIApplication.shared.statusBarStyle = .lightContent
Si vous souhaitez masquer la barre d'état:
UIApplication.shared.isStatusBarHidden = true
Obtenir cette sortie par un contenu léger et par une navigation transparente. J'ai vue fond est gris. vous pouvez voir la transparence.
iPhone XR - Swift 4.2 - Grands titres (Capture d'écran du test)
Si vous utilisez Swift 2.0, utilisez le bloc de code ci-dessous:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
Pour Swift 3.0, utilisez:
navigationController?.setNavigationBarHidden(false, animated: true)
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
Swift 3.0.1 avec Xcode 8.1
Dans votre UINavigationController
override func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
self.view.backgroundColor = UIColor.clear
}
Xcode 8.x: Swift 3: extension pour le même Écrire une fois pour toute utilisation
extension UINavigationBar {
func transparentNavigationBar() {
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
}
}
Créez une extension de UINavigationController
et présentez ou masquez la barre de navigation transparente.
extension UINavigationController {
public func presentTransparentNavigationBar() {
navigationBar.setBackgroundImage(UIImage(), for:UIBarMetrics.default)
navigationBar.isTranslucent = true
navigationBar.shadowImage = UIImage()
setNavigationBarHidden(false, animated:true)
}
public func hideTransparentNavigationBar() {
setNavigationBarHidden(true, animated:false)
navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:UIBarMetrics.default)
navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent
navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
}
}
J'ai essayé toutes les méthodes ci-dessus et j'ai toujours un espace blanc au lieu du contenu censé être rendu. Si vous souhaitez dessiner des sous-vues régulières (Google map, par exemple) et non du contenu UIScrollView via la barre de navigation, vous devez définir le cadre de la sous-vue dans viewDidAppear
.
existingNavigationBar.setBackgroundImage(transparentImageFromAssets, for: .default)
existingNavigationBar.shadowImage = transparentImageFromAssets
existingNavigationBar.isTranslucent = true
étape 2:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.mapView.frame = UIScreen.main.bounds
}
Cela a fonctionné pour moi.