You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模态呈现ViewController时UIButton变灰的解决办法

问题描述

我的一个ViewController中有多个按钮,其中一个按钮会执行segue跳转到另一个ViewController。此时所有按钮的色调变为灰色,当该ViewController被dismiss后,按钮颜色恢复正常。这种变化虽快但十分明显,推测与isHighlighted状态有关。在dismiss时缓慢下滑或按住ViewController,能清晰看到该现象,影响UI观感。设置所有按钮的tint color并未解决问题,如何阻止所有按钮变灰?

解决方案
  • 关闭present时的视图变暗效果
    系统present新VC时,默认会让原VC视图进入半高亮状态,这是按钮变灰的核心原因。针对iOS15及以上,可直接关闭变暗层:

    // 在segue的prepare方法中添加
    if let targetVC = segue.destination as? YourTargetViewController {
        if #available(iOS 15.0, *) {
            targetVC.modalPresentationConfiguration.dimmedViewStyle = .none
        } else {
            // iOS15以下改用全屏present,避免视图变暗
            targetVC.modalPresentationStyle = .fullScreen
        }
    }
    
  • 强制按钮高亮状态保持原色调
    自定义按钮子类,覆盖高亮状态的颜色逻辑:

    class FixedTintButton: UIButton {
        override var isHighlighted: Bool {
            didSet {
                // 替换成你按钮原本的色调值
                tintColor = .systemBlue
                setTitleColor(.systemBlue, for: .highlighted)
                imageView?.tintColor = .systemBlue
            }
        }
    }
    

    嫌写代码麻烦的话,直接在Storyboard选中按钮,在属性面板里把Highlighted状态的文字、图片颜色设置成和Default状态一致即可。

  • 临时禁用原VC视图的用户交互
    present新VC时关闭原视图的交互,阻止系统触发高亮状态:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
        view.isUserInteractionEnabled = false
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        view.isUserInteractionEnabled = true
    }
    

    dismiss后viewDidAppear会自动触发,恢复原视图的交互能力。

内容的提问来源于stack exchange,提问作者vlad_skazka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:28