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

如何禁用navigationBar按钮用户交互且避免灰化视觉效果?

解决导航栏按钮禁用交互但保持原样式的问题

当然可以实现!你想要的禁用导航栏按钮交互但不改变其视觉样式的需求,完全可以通过操作按钮的isUserInteractionEnabled属性来达成,下面给你具体的实现方案:

方案一:自定义UIButton作为导航栏按钮(推荐)

系统默认的UIBarButtonItem设置isEnabled = false时会自动变灰,所以我们可以直接创建自定义的UIButton,将其作为UIBarButtonItem的自定义视图,这样就能单独控制交互状态而不影响外观:

// 创建自定义按钮,匹配系统导航栏按钮的样式
let customLeftButton = UIButton(type: .system)
customLeftButton.setTitle("你的按钮标题", for: .normal)
customLeftButton.titleLabel?.font = UIFont.systemFont(ofSize: 17) // 对齐系统字体大小
customLeftButton.setTitleColor(.systemBlue, for: .normal) // 保持正常颜色

// 禁用交互,但保留原样式
customLeftButton.isUserInteractionEnabled = false

// 将自定义按钮包装为UIBarButtonItem,设置到导航栏
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: customLeftButton)

方案二:修改已存在的导航栏按钮的交互状态

如果你已经有现成的UIBarButtonItem,可以通过获取其内部的控件来修改isUserInteractionEnabled

  • 如果是自定义视图类型的按钮:
if let leftButton = navigationItem.leftBarButtonItem?.customView as? UIButton {
    leftButton.isUserInteractionEnabled = false
}
  • 如果是系统默认样式的按钮(非自定义视图),可以通过遍历子视图找到对应的交互控件:
if let barButtonView = navigationItem.leftBarButtonItem?.value(forKey: "view") as? UIView {
    barButtonView.subviews.forEach { subview in
        if let control = subview as? UIControl {
            control.isUserInteractionEnabled = false
        }
    }
}

关键说明

直接设置UIBarButtonItem.isEnabled = false会触发系统的样式变化(变灰),但修改其内部控件的isUserInteractionEnabled属性,只是单纯禁用用户交互,不会改变按钮的颜色或其他视觉样式,正好满足你的需求。

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

火山引擎 最新活动