UINavigationBar scrollEdgeAppearance不生效 无法实现导航标题随滚动变色
核心问题根源
你对scrollEdgeAppearance的触发逻辑记反了,并不是需求不匹配这个API,纯粹是属性对应的状态、配置值写反了,才导致效果不符合预期。
两个外观属性的实际触发规则
scrollEdgeAppearance:当关联的滚动视图内容刚好停在最顶部边缘、也就是**完全未滚动(contentOffset = 0)**时,导航栏会自动套用这个配置standardAppearance:当滚动视图向上滚动、内容离开顶部边缘、也就是contentOffset > 0 处于滚动状态时,导航栏会自动切换套用这个配置
你之前的代码刚好把两个配置的颜色完全搞反了:- 你给
scrollEdgeAppearance(对应未滚动状态)配置了蓝色标题 - 你给
standardAppearance(对应滚动状态)配置了红色标题
自然出来的效果和需求完全颠倒。
另外你给scrollEdgeAppearance选择的configureWithDefaultBackground()方法也不符合两个状态视觉统一的需求,这个方法会让边缘状态下的导航栏变成半透明毛玻璃浮动效果,滚动后切回不透明样式,会出现突兀的背景跳变。
- 你给
修正后的可直接运行代码
class TableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() // 未滚动(停在内容顶部边缘)状态配置:标题为红色 let edgeAppearance = UINavigationBarAppearance() edgeAppearance.configureWithOpaqueBackground() edgeAppearance.titleTextAttributes = [.foregroundColor: UIColor.red] navigationController?.navigationBar.scrollEdgeAppearance = edgeAppearance // 滚动离开顶部边缘状态配置:标题为蓝色 let standardAppearance = UINavigationBarAppearance() standardAppearance.configureWithOpaqueBackground() standardAppearance.titleTextAttributes = [.foregroundColor: UIColor.blue] navigationController?.navigationBar.standardAppearance = standardAppearance } }
补充说明
- 这套实现是iOS15+系统原生支持的自动切换逻辑,不需要手动监听UITableView的滚动代理去手动修改标题颜色,完全符合系统设计的交互规范
- 如果你需要自定义两个状态下的导航栏背景样式,只需要在两个Appearance实例上分别配置对应背景属性即可,系统会在滚动跨过顶部临界点时自动完成平滑切换

内容的提问来源于stack exchange,提问作者PK-V
相关产品推荐
相关产品推荐

