Прозрачный UINavigationBar в Swift
Я пытаюсь сделать мой UINavigationBar
в UINavigationController
прозрачным. Я создал подкласс UINavigationController
и понравился его в сцене в моем файле раскадровки. Вот часть моего подкласса:
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
}
Когда я запускаю приложение, у него есть панель навигации прозрачная, но строка состояния просто черная.
Например, если я делаю такую вещь на UITabBar
- она работает.
Ответы
Ответ 1
Надеюсь, это поможет вам
Свифт 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()
Свифт 4.2 на Свифт 5.1
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
Или, если вы хотите передать субкласс навигационного контроллера, обратитесь к этому ответу.
Измените стиль строки состояния с помощью:
В вашем Info.plist вы должны определить любое отображение вида строки состояния на основе контроллера.
![enter image description here]()
UIApplication.shared.statusBarStyle = .lightContent
Если вы хотите скрыть строку состояния:
UIApplication.shared.isStatusBarHidden = true
Получение этого вывода по легкому содержанию и прозрачной навигации. У меня вид фона серый. Вы можете увидеть прозрачность.
![enter image description here]()
iPhone XR - Swift 4.2 - Большие названия (Тестовый скриншот)
![Large Titles - Swift - iPhone XR]()
Ответ 2
Если вы используете Swift 2.0, используйте блок кода ниже:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
Для Swift 3.0 используйте:
navigationController?.setNavigationBarHidden(false, animated: true)
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
Ответ 3
Swift 3.0.1 с Xcode 8.1
В 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
}
Ответ 4
Xcode 8.x: Swift 3: расширение для того же
Напишите один раз на протяжении всего
extension UINavigationBar {
func transparentNavigationBar() {
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
}
}
Ответ 5
Создайте расширение UINavigationController
и укажите или скройте прозрачную панель навигации.
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
}
}
Ответ 6
Я перепробовал все методы, описанные выше, и все равно получил пробел вместо контента, который должен быть обработан. Если вы хотите нарисовать обычное подпредставление (Google map fe), а не содержимое UIScrollView через панель навигации, тогда вам нужно установить рамку viewDidAppear
в viewDidAppear
. Итак, шаг 1:
existingNavigationBar.setBackgroundImage(transparentImageFromAssets, for: .default)
existingNavigationBar.shadowImage = transparentImageFromAssets
existingNavigationBar.isTranslucent = true
шаг 2:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.mapView.frame = UIScreen.main.bounds
}
Это сработало для меня.