模态呈现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
相关产品推荐
相关产品推荐

