如何通过代码显示UIMenu?UIButton双长按手势场景问题问询
问题背景
给一个UIButton添加了两个UILongPressGestureRecognizer:
- 第一个
longPressGestureRecognizer,minimumPressDuration = 0.5秒,触发时执行特定操作 - 第二个
prolongedPressGestureRecognizer,minimumPressDuration = 1.5秒,触发时显示上下文菜单
当前无法实现该需求,针对两个疑问给出解决方案:
1. 能否延迟上下文菜单的显示时间?能否修改系统内部触发菜单的长按手势?
系统为绑定UIMenu的UIButton默认提供了内部长按手势来触发菜单,但这个内部手势的参数(比如长按时长)无法直接修改。不过可以通过以下方式间接实现延迟显示:
- 禁用按钮的默认菜单触发行为,避免和自定义手势冲突
- 用自定义的
prolongedPressGestureRecognizer(1.5秒长按)来控制菜单的显示时机
2. 能否通过代码方式显示UIMenu?
可以,UIButton提供了showMenuFromSender:方法,支持通过代码主动唤起上下文菜单。
完整修改代码示例
1. 禁用按钮默认菜单触发
在初始化UIMenu后添加一行代码:
NSMutableArray* actions = [[NSMutableArray alloc] init]; [actions addObject:[UIAction actionWithTitle:@"Edit" image:nil identifier:nil handler:^(__kindof UIAction* _Nonnull action) { // 处理Edit操作逻辑 }]]; UIMenu* menu = [UIMenu menuWithTitle:@"" children:actions]; self.customButton.menu = menu; // 禁用默认菜单触发,改用自定义手势控制 self.customButton.showsMenuAsPrimaryAction = NO;
2. 处理手势冲突
实现UIGestureRecognizerDelegate方法,允许两个自定义长按手势同时识别:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // 仅允许两个自定义长按手势同时识别 if ((gestureRecognizer == self.longPressGestureRecognizer && otherGestureRecognizer == self.prolongedPressGestureRecognizer) || (gestureRecognizer == self.prolongedPressGestureRecognizer && otherGestureRecognizer == self.longPressGestureRecognizer)) { return YES; } return NO; }
3. 手势触发方法实现
// 0.5秒长按触发的特定操作 - (void)longPress:(UILongPressGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { // 执行你的特定操作逻辑 } } // 1.5秒长按触发菜单 - (void)prolongedPress:(UILongPressGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { // 代码唤起上下文菜单 [self.customButton showMenuFromSender:self.customButton]; } }
内容的提问来源于stack exchange,提问作者Vulkan
相关产品推荐
相关产品推荐

