Подтвердить что ты не робот

Прозрачный 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 - она ​​работает.

4b9b3361

Ответ 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
  }

Это сработало для меня.