iOS开发如何实现UIButton仅长按时弹出menu菜单?
给UIButton设置menu后默认点击就弹出菜单,是因为系统默认开启了点击触发菜单的主行为逻辑,直接修改系统提供的属性即可实现和Safari右下角标签按钮完全一致的交互,不需要手写手势识别,系统已经自动处理好了手势判定、过渡动画、交互优先级等所有细节。
实现步骤
- 按原有逻辑正常配置按钮的
menu属性,菜单相关代码不需要做任何调整 - 将按钮的
showsMenuAsPrimaryAction属性设置为false,配置完成后点击按钮不会自动弹出菜单,只有长按交互才会触发菜单展示 - 给按钮绑定常规的
.touchUpInside点击事件,在事件回调中编写自定义逻辑即可,比如修改按钮文本、跳转标签页视图等操作都可以放在这里执行
代码示例
// 1. 正常配置菜单 let newTab = UIAction(title: "新建标签页") { _ in // 对应菜单项的点击逻辑 } let closeAll = UIAction(title: "关闭所有标签页") { _ in // 对应菜单项的点击逻辑 } tabButton.menu = UIMenu(children: [newTab, closeAll]) // 2. 核心配置:关闭点击触发菜单,仅保留长按触发 tabButton.showsMenuAsPrimaryAction = false // 3. 绑定普通点击事件 tabButton.addTarget(self, action: #selector(tabButtonTapped), for: .touchUpInside) @objc private func tabButtonTapped() { // 点击时执行自定义操作 tabButton.setTitle("\(tabs.count)个标签", for: .normal) showTabListPage() }
说明
showsMenuAsPrimaryAction从iOS 14开始支持,和UIButton的menu属性适配版本完全一致,不需要额外做版本兼容- 不要自行添加长按手势来手动呼出菜单,会破坏系统原生的交互手感,还可能出现手势冲突、判定不准的问题,用上述系统属性实现的效果和Safari原生按钮完全对齐
内容的提问来源于stack exchange,提问作者user_
相关产品推荐
相关产品推荐

