You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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子视图类名贴出来,我再帮你抠细节!

火山引擎 最新活动