iOS 26.2自定义TabBar默认Liquid Glass选中效果无法移除求助
iOS 26.2自定义TabBar默认Liquid Glass选中效果无法移除求助
兄弟,我太懂这种iOS版本迭代带来的控件样式“玄学”问题了!你在iOS18上好好的自定义TabBar,到了26.2就冒出默认的Liquid Glass选中效果,试了好几种方法都没用,确实闹心。结合你现在的代码,给你几个针对性的调整思路,应该能把iOS26的效果拉回和18一致:
1. 彻底覆盖选中状态的Appearance配置
iOS26大概率对TabBar的选中状态样式做了单独的属性管控,你之前的Appearance配置只覆盖了背景,没彻底处理选中指示器和选中状态的样式。在你的disableLiquidGlass()方法里,加上这些代码:
// 覆盖堆叠布局下的选中状态样式(适配大部分场景) appearance.stackedLayoutAppearance.selected.iconColor = .yourCustomSelectedColor // 改成你实际用的选中图标颜色 appearance.stackedLayoutAppearance.selected.titleTextAttributes = [ .foregroundColor: .yourCustomSelectedTextColor // 对应选中文字颜色 ] // 直接清空选中指示器的视觉效果 appearance.selectionIndicatorImage = UIImage() appearance.selectionIndicatorTintColor = .clear // 别忘了加上紧凑布局的Appearance(iOS26可能新增了对紧凑布局的强制适配) tabBar.compactAppearance = appearance tabBar.compactScrollEdgeAppearance = appearance
这样能从根源上告诉系统:选中状态我完全自定义了,别瞎加Liquid Glass效果。
2. 调整子视图移除的逻辑(适配iOS26的内部视图变化)
你之前在viewDidLayoutSubviews里只移除UIVisualEffectView,但iOS26可能把Liquid Glass选中效果封装成了新的内部视图类。把移除逻辑改成这样:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() tabBar.subviews.forEach { subview in // 移除所有视觉效果视图 if subview is UIVisualEffectView { subview.removeFromSuperview() } // 针对iOS26新增的选中效果视图(类名大概率带Selection/Glass/Liquid关键词) let subviewClassName = String(describing: type(of: subview)) if subviewClassName.contains("Selection") || subviewClassName.contains("Glass") { subview.removeFromSuperview() } } }
如果还是不行,你可以先打印所有子视图的类名(print(subviewClassName)),看看iOS26里负责Liquid Glass选中效果的视图到底叫啥,精准移除。
3. 延迟执行移除操作(规避系统的视图重绘时机)
iOS26可能会在viewDidLayoutSubviews之后,又偷偷把默认的效果视图加回来。你可以把移除逻辑放到viewDidAppear里延迟执行,确保系统的默认视图已经完全加载后再清除:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 延迟0.1秒足够等系统完成所有默认视图的添加 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in guard let self = self else { return } self.tabBar.subviews.forEach { subview in if subview is UIVisualEffectView || String(describing: type(of: subview)).contains("Selection") { subview.removeFromSuperview() } } } }
注意用[weak self]避免循环引用哈。
最后再检查几个细节
- 确保你的
setupTabBar()方法里,没有在之后又重置了TabBar的Appearance或者属性 - 保持
tabBar.isTranslucent = false这个设置,一旦设为true,系统很可能又会自动套上半透明/Glass效果
你按这个顺序试下来,应该能把iOS26的Liquid Glass选中效果彻底干掉,和iOS18的表现统一。要是还不行,你可以把打印出来的iOS26 TabBar子视图类名贴出来,我再帮你抠细节!




