ios - iOS 13 中的条形按钮色调颜色
问题描述
在 iOS 13 中,他们改变了导航栏颜色的操作方式。现在他们使用 UINavigationBarAppearance 和 UIBarButtonItemAppearance 以及 standardAppearance 和 scrollEdgeAppearance 来自定义导航栏。
我正在寻找一种方法来为standardAppearance 和scrollEdgeAppearance 设置不同的导航栏色调。或者能够更改每个外观的条形按钮图标颜色。
//set the standard nav bar appearance
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.backgroundColor = UIColor.mainAppColorForNavBar
//set bar button appearance
let buttonAppearance = UIBarButtonItemAppearance()
buttonAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.white]
navBarAppearance.buttonAppearance = buttonAppearance
UINavigationBar.appearance(whenContainedInInstancesOf: [UINavigationController.self]).standardAppearance = navBarAppearance
//set the scroll edge nav bar appearance
let scrollNavBarAppearance = UINavigationBarAppearance()
scrollNavBarAppearance.configureWithOpaqueBackground()
scrollNavBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.label]
scrollNavBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.label]
//set bar button appearance
let scrollButtonAppearance = UIBarButtonItemAppearance()
scrollButtonAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.label]
scrollNavBarAppearance.buttonAppearance = scrollButtonAppearance
UINavigationBar.appearance(whenContainedInInstancesOf: [UINavigationController.self]).scrollEdgeAppearance = scrollNavBarAppearance
这将设置导航栏色调颜色,但不区分标准外观和滚动边缘外观。
UINavigationBar.appearance().tintColor = UIColor.white
目前在 scrollEdgeAppearance (看起来我想要的方式,不需要更改)
目前在standardAppearance(按钮丢失,因为它与背景颜色相同,我想在standardAppearance中将图标颜色更改为白色)
任何帮助表示赞赏。
谢谢,
解决方案
我遇到了后退按钮的类似问题,并通过为每种外观设置具有不同渲染模式的图像来解决它。这样可以避免应用 tintColor。
// demo image
let image = UIImage(systemName: "ellipsis.circle")!
// image with .alwaysOriginal rendering mode to avoid tintColor application
let imageForNavBarAppearance = image
.withTintColor(.black)
.withRenderingMode(.alwaysOriginal)
let imageForScrollNavBarAppearance = image
.withTintColor(.green)
.withRenderingMode(.alwaysOriginal)
// your UINavigationBarAppearance instances
navBarAppearance.setBackIndicatorImage(imageForNavBarAppearance, transitionMaskImage: imageForNavBarAppearance)
scrollNavBarAppearance.setBackIndicatorImage(imageForScrollNavBarAppearance, transitionMaskImage: imageForScrollNavBarAppearance)
这仅解决了后退按钮的问题。
还有两个其他选项可以为栏项外观设置背景图像。
UINavigationBarAppearance.buttonAppearance
带有背景图像的外观配置将应用于所有条形项目。这应该没问题,因为您只有一个条形项目。
UINavigationBarAppearance.doneButtonAppearance
如果您要为右上角的“+”符号创建完成样式栏项目,则应应用此外观配置。
let ap = UIBarButtonItemAppearance()
ap.normal.backgroundImage = image.withTintColor(.black).withRenderingMode(.alwaysOriginal)
let scrollAp = UIBarButtonItemAppearance()
scrollAp.normal.backgroundImage = image.withTintColor(.green).withRenderingMode(.alwaysOriginal)
// apply to all bar items
navBarAppearance.buttonAppearance = ap
scrollNavBarAppearance.buttonAppearance = scrollAp
// or apply to done buttons
navBarAppearance.doneButtonAppearance = ap
scrollNavBarAppearance.doneButtonAppearance = scrollAp
推荐阅读
- powershell - 检查字符串是否包含PowerShell中的数值?
- javascript - 如何在循环内有一个同步和异步延迟承诺
- asp.net-core - 多租户 Azure 托管的 ASP.NET Core 2.1 Web Api 上的字段级权限缓存
- python - 如何模拟 Pytest 的库类
- php - Codeigniter - Sql 数据库
- google-bigquery - 尝试在标准 SQL BigQuery 中使用 CAST 将十六进制时间戳转换为十进制
- regex - 至少 5 个字符但没有前导或尾随空格的 html 模式
- ember.js - {{#link-to}} 破坏语义 UI
- laravel - vue 应用程序中的路由器视图和组件(laravel)
- c# - 如何处理微服务中的表连接