如何实现iOS工具栏无系统颜色变化的透明模糊效果?
解决iOS工具栏空内容纯黑/滚动时模糊的实现问题
你的问题出在同时给backgroundEffect和backgroundColor赋值,且未区分standardAppearance和scrollEdgeAppearance的适用场景——原生消息应用的效果正是靠这两个Appearance分别控制两种状态实现的:
- 无内容在工具栏后方时:使用
scrollEdgeAppearance,纯实色背景(无模糊) - 有内容滚动到工具栏后方时:使用
standardAppearance,仅保留模糊效果
修正后的实现代码如下:
// 1. 配置「无内容时」的工具栏样式(scrollEdgeAppearance) let scrollEdgeAppearance = UIToolbarAppearance() scrollEdgeAppearance.backgroundColor = UIColor(dynamicProvider: { traitCollection in return traitCollection.userInterfaceStyle == .dark ? .black : .white }) scrollEdgeAppearance.backgroundEffect = nil // 关闭模糊,使用纯实色 scrollEdgeAppearance.shadowColor = .clear // 2. 配置「有内容滚动时」的工具栏样式(standardAppearance) let standardAppearance = UIToolbarAppearance() standardAppearance.backgroundEffect = UIBlurEffect(style: .systemUltraThinMaterial) standardAppearance.backgroundColor = .clear // 移除半透明底色,让模糊效果完全展示 standardAppearance.shadowColor = .clear // 3. 分别赋值给全局Toolbar外观 UIToolbar.appearance().standardAppearance = standardAppearance UIToolbar.appearance().scrollEdgeAppearance = scrollEdgeAppearance
关键说明:
scrollEdgeAppearance:当工具栏处于视图边界(无内容在后方)时生效,直接使用纯黑/纯白,关闭模糊效果,和原生消息应用的空状态完全匹配。standardAppearance:当有内容滚动到工具栏下方时生效,仅保留systemUltraThinMaterial的模糊效果,底色设为透明,避免半透明颜色覆盖模糊层,让后方内容的模糊效果自然呈现。- 动态颜色适配:通过
dynamicProvider自动适配深浅色模式,无需额外写分支判断。
这样设置后,就能实现和iOS原生消息、Messenger、Signal一致的工具栏效果。
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

