如何添加响应式UIBarButtonItem?自定义按钮选中状态判断方法
一、添加响应式UIBarButtonItem
其实UIBarButtonItem本身的交互灵活性有限,我通常会用UIButton作为它的自定义视图来实现响应式效果——毕竟UIButton天然支持各种状态和交互逻辑,步骤很简单:
- 先创建一个UIButton实例,设置好尺寸(导航栏按钮标准尺寸是44x44)、默认图片/文字等样式
- 给按钮绑定点击事件
- 把这个按钮作为
customView传入UIBarButtonItem的初始化方法 - 最后将这个UIBarButtonItem添加到导航栏的左侧或右侧按钮组里
给你个Swift代码示例参考:
// 创建自定义按钮 let customButton = UIButton(type: .custom) customButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44) customButton.setImage(UIImage(named: "normal_icon"), for: .normal) customButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) // 包装成UIBarButtonItem let customBarItem = UIBarButtonItem(customView: customButton) // 添加到导航栏右侧 navigationItem.rightBarButtonItem = customBarItem
如果你的项目是iOS 13及以上,也可以直接用UIBarButtonItem(title:image:primaryAction:)来绑定动作,但自定义样式的话,还是UIButton的方式更可控。
二、点击切换图片并判断选中状态
你说得没错,UIBarButtonItem本身确实没有isTapped或isSelected属性,但我们可以借助它的customView(也就是上面的UIButton)来解决——UIButton自带isSelected状态,刚好能满足需求:
- 初始化按钮时,提前设置好
normal和selected两种状态的图片 - 在点击事件里直接切换按钮的
isSelected属性 - 通过按钮的
isSelected就能直接判断当前是否处于选中状态
代码示例如下:
// 初始化时设置两种状态的图片 customButton.setImage(UIImage(named: "normal_icon"), for: .normal) customButton.setImage(UIImage(named: "selected_icon"), for: .selected) // 点击事件处理 @objc func buttonTapped(_ sender: UIButton) { // 切换选中状态 sender.isSelected.toggle() // 根据状态做后续逻辑 if sender.isSelected { print("按钮现在是选中状态") } else { print("按钮现在是未选中状态") } }
要是你不想用UIButton自带的状态,也可以自己在ViewController里维护一个布尔变量,比如private var isBarItemSelected = false,每次点击时切换这个变量,再手动设置按钮图片:
@objc func buttonTapped(_ sender: UIButton) { isBarItemSelected.toggle() let imageName = isBarItemSelected ? "selected_icon" : "normal_icon" sender.setImage(UIImage(named: imageName), for: .normal) }
不过我更推荐用UIButton自带的状态管理,代码更简洁,也符合iOS控件的设计逻辑。
内容的提问来源于stack exchange,提问作者A.M.
相关产品推荐
相关产品推荐

