Catalyst:如何通过代码触发打开上下文菜单
刚好碰到过类似的需求,其实利用UIContextMenuInteraction本身提供的API就能轻松实现,不用重新构造菜单内容,直接复用你已经写好的delegate逻辑就行,具体步骤如下:
1. 给按钮添加点击事件监听
首先给你的editButton添加一个touchUpInside事件的监听,用来响应iPad上的轻触操作:
override func viewDidLoad() { super.viewDidLoad() // 你原来的代码:添加上下文菜单交互 let interaction = UIContextMenuInteraction(delegate: self) editButton.addInteraction(interaction) // 新增:给按钮添加点击事件(仅在iPad上添加,避免Mac上重复触发) if UIDevice.current.userInterfaceIdiom == .pad { editButton.addTarget(self, action: #selector(handleButtonTapToShowMenu), for: .touchUpInside) } }
2. 实现点击事件的处理方法
在这个方法里,我们直接找到按钮上已添加的UIContextMenuInteraction,调用它的presentMenu(at:in:preferredPlacement:)方法来触发菜单:
@objc private func handleButtonTapToShowMenu() { // 找到按钮上的UIContextMenuInteraction实例 guard let contextMenuInteraction = editButton.interactions.first(where: { $0 is UIContextMenuInteraction }) as? UIContextMenuInteraction else { return } // 指定菜单的触发位置(这里用按钮底部中点,让菜单从按钮下方居中弹出) let triggerPoint = CGPoint(x: editButton.bounds.midX, y: editButton.bounds.maxY) // 触发菜单,设置附着位置让菜单贴合按钮 contextMenuInteraction.presentMenu( at: triggerPoint, in: editButton, preferredPlacement: .menuAttachment ) }
关键参数说明
at::菜单触发的相对位置,坐标系是传入的视图(这里是editButton)的本地坐标系,你可以根据UI需求调整点的位置,比如改成按钮顶部中点让菜单向上弹出。preferredPlacement::控制菜单的显示姿态,.menuAttachment会让菜单紧密附着在触发点附近,是按钮点击场景下的最优选择;你也可以试试.bottom、.top等其他选项,适配不同布局。
额外小提示
上面的代码已经做了设备判断,只在iPad上添加点击事件,Mac上依然保持右键触发的原有逻辑,不会出现功能冲突。
内容的提问来源于stack exchange,提问作者emreoktem
相关产品推荐
相关产品推荐

