iOS13 Панель навигации большие заголовки, не покрывающие строку состояния

На ios13, с iphone x, навигация по большому заголовку не покрывает строку состояния, однако при прокрутке и переходе в традиционную навигационную панель она работает отлично. Это не влияет на устройства без надреза.

Большие названия enter image description here

Традиционная панель навигации

Все это встроено в контроллер навигации, поэтому я заблудился относительно того, почему это происходит. ура

Ответы

Ответ 1

Официальный способ настройки UINavigationBar, предшествующий iOS 13, заключается в следующем:

// text/button color
UINavigationBar.appearance().tintColor = .white
// background color
UINavigationBar.appearance().barTintColor = .purple
// required to disable blur effect & allow barTintColor to work
UINavigationBar.appearance().isTranslucent = false

iOS 13 изменила работу навигационных панелей, поэтому вам нужно будет сделать что-то немного по-другому, чтобы поддерживать и old & новые:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.backgroundColor = .purple
    appearance.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]

    UINavigationBar.appearance().tintColor = .white
    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
} else {
    UINavigationBar.appearance().tintColor = .white
    UINavigationBar.appearance().barTintColor = .purple
    UINavigationBar.appearance().isTranslucent = false
}

Ответ 2

Вы можете изменить цвет фона подпункта UINavigationBar для достижения этой цели.

В методе AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: UIControl.State.normal)

    return true
}

В методе viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

    self.navigationController?.navigationBar.backgroundColor = .purple
}

Выход

enter image description here

Выполните UINavigationBar подпредставлений UINavigationBar следующим образом:

override func viewDidAppear(_ animated: Bool) {

    for vw in navigationController?.navigationBar.subviews ?? [UIView()] {
        if NSStringFromClass(vw.classForCoder).contains("UIBarBackground") {
             vw.backgroundColor = .purple
        }
    }
}

enter image description here

Ответ 3

Используйте мое расширение iOS 13 Swift 5 протестировано

extension UIViewController {
func configureNavigationBar(largeTitleColor: UIColor, backgoundColor: UIColor, tintColor: UIColor, title: String, preferredLargeTitle: Bool) {
    if #available(iOS 13.0, *) {
        let navBarAppearance = UINavigationBarAppearance()
        navBarAppearance.configureWithOpaqueBackground()
        navBarAppearance.largeTitleTextAttributes = [.foregroundColor: largeTitleColor]
        navBarAppearance.titleTextAttributes = [.foregroundColor: largeTitleColor]
        navBarAppearance.backgroundColor = backgoundColor

        navigationController?.navigationBar.standardAppearance = navBarAppearance
        navigationController?.navigationBar.compactAppearance = navBarAppearance
        navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance

        navigationController?.navigationBar.prefersLargeTitles = preferredLargeTitle
        navigationController?.navigationBar.isTranslucent = false
        navigationController?.navigationBar.tintColor = tintColor
        navigationItem.title = title

    } else {
        // Fallback on earlier versions
        navigationController?.navigationBar.barTintColor = backgoundColor
        navigationController?.navigationBar.tintColor = tintColor
        navigationController?.navigationBar.isTranslucent = false
        navigationItem.title = title
    }
}}

Как использовать:

configureNavigationBar(largeTitleColor: .yourColor, backgoundColor: .yourColor, tintColor: .yourColor, title: "yuorTitle", preferredLargeTitle: true)

Установите строку состояния на основе ViewController...... на NO в info.plist, если вы хотите легкий контент

Если вы не хотите, чтобы для LargeTitles было задано значение false

для прозрачного изменения navBarAppearance.configureWithOpaqueBackground() в:

navBarAppearance.configureWithDefaultBackground()
navigationController?.navigationBar.isTranslucent = true

в вызове установите цвет фона на .clear

надеюсь, это поможет :)