如何禁用SwiftUI中ToolbarItem滚动时的默认高亮效果?
如何禁用SwiftUI ToolbarItem滚动时的高亮效果?
默认情况下,当List等内容滚动到SwiftUI的ToolbarItem后方时,该ToolbarItem会自动高亮。请问是否可以禁用这一高亮效果?例如Signal应用中的ToolbarItem始终保持不变,带有精致的薄材质效果,是使用了自定义工具栏还是可修改系统默认设置?
滚动前未高亮状态:
滚动时高亮状态:
相关代码示例:
.navigationBarTitle("Element", displayMode: .inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Menu { Button(action: { selectedFilter = .all }) { Label("Show All", systemImage: "line.3.horizontal") } } } }
解决方案
要禁用ToolbarItem滚动时的高亮效果,有两种实用实现方式:
- 配置全局导航栏外观
通过修改UINavigationBar的外观设置,强制保持统一的背景样式,覆盖系统默认的动态变化逻辑:
init() { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() // 设置薄材质背景,匹配Signal的视觉效果 appearance.backgroundEffect = UIBlurEffect(style: .systemUltraThinMaterial) // 同步标准状态和滚动边缘状态的样式 UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }
将这段代码添加到你的View初始化方法中,导航栏(包含ToolbarItem)在滚动时就不会切换高亮样式了。
- 自定义工具栏容器
如果不想修改全局导航栏样式,可以用ZStack手动实现固定样式的工具栏,完全脱离系统Toolbar的默认行为:
ZStack(alignment: .top) { List { // 你的列表内容 } .navigationBarHidden(true) // 隐藏系统默认导航栏 // 自定义固定样式工具栏 VStack { HStack { Text("Element") .font(.headline) Spacer() Menu { Button(action: { selectedFilter = .all }) { Label("Show All", systemImage: "line.3.horizontal") } } label: { Image(systemName: "ellipsis.circle") .foregroundColor(.primary) } } .padding(.horizontal) .padding(.vertical, 8) .background(.ultraThinMaterial) Spacer() } }
这种方式自由度更高,能完全复刻Signal的工具栏视觉效果。
说明
Signal应用大概率采用的是配置全局导航栏外观的方案,既保留了系统Toolbar的原生交互逻辑,又通过UINavigationBarAppearance固定了视觉样式,实现滚动时无高亮变化的效果。
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

