iOS13 Панель навигации большие заголовки, не покрывающие строку состояния
На ios13, с iphone x, навигация по большому заголовку не покрывает строку состояния, однако при прокрутке и переходе в традиционную навигационную панель она работает отлично. Это не влияет на устройства без надреза.
Большие названия
Традиционная панель навигации
Все это встроено в контроллер навигации, поэтому я заблудился относительно того, почему это происходит. ура
Ответы
Ответ 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
}
Выход
Выполните UINavigationBar
подпредставлений UINavigationBar
следующим образом:
override func viewDidAppear(_ animated: Bool) {
for vw in navigationController?.navigationBar.subviews ?? [UIView()] {
if NSStringFromClass(vw.classForCoder).contains("UIBarBackground") {
vw.backgroundColor = .purple
}
}
}
Ответ 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
надеюсь, это поможет :)