当 NavigationBar 为大标题时,不应用 barTintColor
barTintColor not applied when NavigationBar is Large Titles
我正在更新在 Xcode 10 和 运行 上编译到 iOS 13 的应用程序。我想进行一些更改,因此在 Xcode 上重新编译] 11、现在barTintColor有问题。
如果 'Large Titles' 设置为 'Always',我的自定义 barTintColor 将不会应用——我只会得到默认的灰色。如果 'Large Titles' 设置为 'Never',我的自定义 barTintColor 将按预期应用。如果 'Large Titles' 设置为 'Automatic',则 NavBar 在显示大标题时默认为灰色,在显示小标题时为自定义颜色。例如,当我的导航栏下方的 TableView 被向上推时,默认的大标题切换为小标题,并且我的导航栏改变颜色。正常行为是它始终是我的自定义颜色。
来自我的 ViewController class 的相关代码,最后一行是设置 barTintColor 的代码:
override func viewDidLoad() {
super.viewDidLoad()
setDelegates()
setTableViewHeightForCollapsingHeaders()
setNavigtionBarItems()
doSplitViewManagement()
}
override func viewWillAppear(_ animated: Bool) {
clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
super.viewWillAppear(animated)
updateUI()
}
fileprivate func setNavigtionBarItems() {
//set up UI buttons
navigationItem.leftBarButtonItem = editButtonItem
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
navigationItem.rightBarButtonItem = addButton
navigationController?.navigationBar.barTintColor = UIColor(hex: 0x5da0a2)
}
知道行为改变的原因以及如何解决吗?
自 iOS 13 https://developer.apple.com/documentation/uikit/uinavigationbarappearance
以来有一个新的 API
你要找的backgroundColor 属性在超级class
https://developer.apple.com/documentation/uikit/uibarappearance
这里有一些额外的示例代码
https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar
glotcha 指出的 Apple 文档对于解决问题至关重要,尽管它还有更多内容。这是我的 setNavigationBarItems()
的更新版本,适用于 iOS 13:
fileprivate func setNavigtionBarItems() {
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = myBackgroundColor
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
//navigationController?.navigationBar.compactAppearance = appearance
} else {
// Fallback on earlier versions
navigationController?.navigationBar.barTintColor = myBackgroundColor
}
}
我的案例中的一个关键点是我的导航栏设置(在自动布局中)'Large Titles' 为 'Automatic'。这使得有必要包含 .scrollEdgeAppearance
行,以便在从大到紧凑转换时应用自定义外观。原来 .compactAppearance
行不是必需的,因为我对两者使用相同的颜色。如果我想要大和紧凑的不同外观设置,那么带有 .compactAppearance
的行也很有用。
如果你想在一个地方为整个应用程序做这件事:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let barBackgroundColor = UIColor(displayP3Red: 47/255, green: 54/255, blue: 64/255, alpha: 1.0)
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = barBackgroundColor
appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
return true
}
我正在更新在 Xcode 10 和 运行 上编译到 iOS 13 的应用程序。我想进行一些更改,因此在 Xcode 上重新编译] 11、现在barTintColor有问题。
如果 'Large Titles' 设置为 'Always',我的自定义 barTintColor 将不会应用——我只会得到默认的灰色。如果 'Large Titles' 设置为 'Never',我的自定义 barTintColor 将按预期应用。如果 'Large Titles' 设置为 'Automatic',则 NavBar 在显示大标题时默认为灰色,在显示小标题时为自定义颜色。例如,当我的导航栏下方的 TableView 被向上推时,默认的大标题切换为小标题,并且我的导航栏改变颜色。正常行为是它始终是我的自定义颜色。
来自我的 ViewController class 的相关代码,最后一行是设置 barTintColor 的代码:
override func viewDidLoad() {
super.viewDidLoad()
setDelegates()
setTableViewHeightForCollapsingHeaders()
setNavigtionBarItems()
doSplitViewManagement()
}
override func viewWillAppear(_ animated: Bool) {
clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
super.viewWillAppear(animated)
updateUI()
}
fileprivate func setNavigtionBarItems() {
//set up UI buttons
navigationItem.leftBarButtonItem = editButtonItem
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
navigationItem.rightBarButtonItem = addButton
navigationController?.navigationBar.barTintColor = UIColor(hex: 0x5da0a2)
}
知道行为改变的原因以及如何解决吗?
自 iOS 13 https://developer.apple.com/documentation/uikit/uinavigationbarappearance
以来有一个新的 API你要找的backgroundColor 属性在超级class https://developer.apple.com/documentation/uikit/uibarappearance
这里有一些额外的示例代码 https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar
glotcha 指出的 Apple 文档对于解决问题至关重要,尽管它还有更多内容。这是我的 setNavigationBarItems()
的更新版本,适用于 iOS 13:
fileprivate func setNavigtionBarItems() {
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = myBackgroundColor
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
//navigationController?.navigationBar.compactAppearance = appearance
} else {
// Fallback on earlier versions
navigationController?.navigationBar.barTintColor = myBackgroundColor
}
}
我的案例中的一个关键点是我的导航栏设置(在自动布局中)'Large Titles' 为 'Automatic'。这使得有必要包含 .scrollEdgeAppearance
行,以便在从大到紧凑转换时应用自定义外观。原来 .compactAppearance
行不是必需的,因为我对两者使用相同的颜色。如果我想要大和紧凑的不同外观设置,那么带有 .compactAppearance
的行也很有用。
如果你想在一个地方为整个应用程序做这件事:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let barBackgroundColor = UIColor(displayP3Red: 47/255, green: 54/255, blue: 64/255, alpha: 1.0)
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = barBackgroundColor
appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
return true
}